标签:
1.jni是Java native interface的缩写,java 本地接口。它提供了若干的API实现了Java和其他语言的通信(主要是C/C++)。从Java1.1开始,jni标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。
2.ndk:Android NDK 是在SDK前面又加上了“原生”二字,即Native Development Kit,因此又被Google称为“NDK”。
3..so:共享函数库,在可执行程序启动的时候加载,所有程序重新运行时都可自动加载共享函数库中的函数。
4.为何要使用ndk?
1. 代码的保护,由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。
2. 在NDK中调用第三方C/C++库,因为大部分的开源库都是用C/C++代码编写的。
3. 便于移植,用C/C++写的库可以方便在其他的嵌入式平台上再次使用。
1.首先下载ndk包
2.进入菜单右上角file->Project Structure:进入下面界面,在最下面Android ndk location选择本地ndk的目录点击OK
3.新建项目后,选择file->new ->Floder->jni Folder:
这时java目录下会出现一个jni文件夹
4.配置本地项目的Build.gradle,选中Module下的Build.gradle,添加如下内容
apply plugin: ‘com.android.application‘
android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
defaultConfig {
applicationId "com.example.lancao.myhellojni"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
//在此处添加配置
ndk{
moduleName "lancao"
ldLibs "log","z","m"
abiFilters "armeabi","armeabi-v7a","x86"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile(‘proguard-android.txt‘), ‘proguard-rules.pro‘
}
}
}
dependencies {
compile fileTree(dir: ‘libs‘, include: [‘*.jar‘])
testCompile ‘junit:junit:4.12‘
compile ‘com.android.support:appcompat-v7:23.3.0‘
}
5.静态加载动态库,编写naive方法,和普通java方法基本没区别。
package com.example.lancao.myhellojni;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = (TextView) findViewById(R.id.text);
textView.setText(getStringFromNative());
}
//静态加载动态库
static {
System.loadLibrary("lancao");
}
//申明本地方法
public native String getStringFromNative();
}
6.生成头文件。在android studio 的命令行界面中,进入/app/src/main/java目录下,执行命令:
javah -d ../jni com.example.lancao.myhellojni.MainActivity
这样就在src/main/目录中新增了jni目录,以及com_example_lancao_myhellojni_MainActivity.h头文件。
7.com_example_lancao_myhellojni_MainActivity.h的具体内容为
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_lancao_myhellojni_MainActivity */
#ifndef _Included_com_example_lancao_myhellojni_MainActivity
#define _Included_com_example_lancao_myhellojni_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif
#endif
8.新建c本地文件
//导入本地的库文件,必须添加
#include <android/log.h>
#include <jni.h>
JNIEXPORT jstring JNICALL Java_com_example_lancao_myhellojni_MainActivity_getStringFromNative(JNIEnv * env , jobject j)
{
//返回一个字符串“hello from jni !”
return (*env)->NewStringUTF(env,"Hello From JNI!");
}
9.这样就完成了交叉编译之输出helloWorld了
JNI交叉编译第一篇之输出helloWorld(android studio版)
标签:
原文地址:http://blog.csdn.net/myloveyaqiong/article/details/51362618