一 新建一個(gè)HelloJNI項(xiàng)目
二 在MainActivity中創(chuàng)建要使用的JNI方法
static{System.loadLibrary("hello_jni");}
這個(gè)是用來加載本地的library庫.請(qǐng)記住"hello_jni",這個(gè)后面在gradle中要使用到.
三 使用jdk生成c++文件
1.打開androidStudio的Terminal窗口,輸入javah查看jdk是否配置正確,如果不正確請(qǐng)參照jdk環(huán)境變量配置 .
2.使用命令進(jìn)入到項(xiàng)目的java目錄.
cd app\src\main\java
3.使用命令生成c++文件
javah -encoding utf-8 -jni com.zrb.hellojni.MainActivity
第一個(gè)參數(shù)是編譯的時(shí)候使用utf-8的編碼,如果不加可能會(huì)出現(xiàn)編碼錯(cuò)誤,第二個(gè)參數(shù)jni后面是想要生成jni的類名.如果看到j(luò)ava目錄下面生成一個(gè)com_zrb_hellojni_MainActivity.h的文件就是編譯成功.這就是目標(biāo)的c++文件.
四 在MainActivity中獲取到JNI返回的數(shù)據(jù)
1.在main文件夾下新建一個(gè)資源文件夾,并且把生成出來的com_zrb_hellojni_mainActivity.h放入其中.
2.在build.gradle的defaultConfig中加入如下的代碼,其中"hello_jni",就是之前在MainActivity中設(shè)置的名稱,abiFilters就是所要支持的cpu型號(hào).
ndk {moduleName"hello_jni"
abiFilters"armeabi","armeabi-v7a","x86"}
3.在gradle.properties中加入一下這段代碼.表示支持NDK庫.
android.useDeprecatedNdk=true
4.編寫com_zrb_hellojni_mainActivity.h中的c++代碼.
上面我們要關(guān)心的就是兩個(gè)方法,
JNIEXPORT jstring JNICALL Java_com_zrb_hellojni_MainActivity_helloJni
(JNIEnv *,jclass);
JNIEXPORT jint JNICALL Java_com_zrb_hellojni_MainActivity_addCalc
(JNIEnv *,jclass,jint,jint);
這兩個(gè)方法就是在MainActivity中的helloJni();和addCalc(inta, intb);接下來給這兩個(gè)方法加上方法體和參數(shù)名.
JNIEXPORT jstring JNICALL Java_com_zrb_hellojni_MainActivity_helloJni
(JNIEnv * env,jclass jcl){
return env->NewStringUTF("hello jni");
};
JNIEXPORT jint JNICALL Java_com_zrb_hellojni_MainActivity_addCalc
(JNIEnv * env,jclass jcl,jint a,jint b){
return a+b;
};
最后要把com_zrb_hellojni_mainActivity.h的后綴修改成cpp,就是com_zrb_hellojni_mainActivity.cpp.然后運(yùn)行代碼.就能在MainActivity中看到j(luò)ni返回的數(shù)據(jù)
五 總結(jié)
最后編譯成功的so文件會(huì)在app\build\intermediates\ndk\debug\lib下面.這里面的so文件可以導(dǎo)入項(xiàng)目中使用.
項(xiàng)目已分享到github HelloJNI .