NDK工具開發JNI
1,創建工程
2,創建native方法
//該類的路徑在main目錄任意包下即可
public class JniUtils {
public static native String getStringFromC();
}
3, 配置ndk的路徑,如果沒有自行到 http://www.androiddevtools.cn/ 下載,或者翻牆同步下,自動下載.
4,在app項目下gradle的 defaultConfig{ }內添加
ndk {
//生成的so名字
moduleName "JniDemo"
}
5,項目的根目錄下找到 gradle.properties 添加語句
android.useDeprecatedNdk=true
6,到指定class包的根目錄下,使用jni編譯h 文件.
//注意這裏是包的根目錄,而不是class文件的子目錄
cd class文件路徑/intermediates/classes/debug
編譯h 文件:
//緊接着上一步terminal 編譯 h文件
javah -jni com.relicemxd.jnidemo.ndk.JniUtils
//你也可以指定編譯的h 文件到指定目錄
javah -d /這裏是app項目的路徑/JniDemo/app/src/main/jni -jni com.relicemxd.jnidemo.ndk.JniUtils
7,複製剛生成的 .h文件到 mian/jni 下
下面是.c文件的代碼實現:
#include "com_relicemxd_jnidemo_ndk_JniUtils.h"
//這裏是C代碼的實現
JNIEXPORT jstring JNICALL Java_com_relicemxd_jnidemo_ndk_JniUtils_getStringFromC
(JNIEnv *env, jclass cls) {
return (*env)->NewStringUTF(env, "這是來自C的string !");
}
static{
System.loadLibrary("JniDemo");//.so文件名,注意這裏的名字要與gradle的命名一致
}
9,調用native方法
activity調用 native 就可以獲取c的輸出了.
10,運行結果
歡迎star, 有問題可以issue.
demo : https://github.com/relice/JniDemo
注意問題:
錯誤1:未指定類.
原因:
javah 命令執行條件是,包的路徑與終端執行的路徑一致(不可在子路徑下執行)
解決:
cd 進入的路徑要在class包下的根目錄
錯誤2: java.lang.UnsatisfiedLinkError: No implementation found for java.lang.String
原因:
javah生成的頭文件與 main目錄下的頭文件不一致.
解決:
step1.則要重新clean project ->build project ,否則項目會有緩存,編譯照樣報錯的.
step2.javah -d 指定scr/mian目錄下生成頭文件 -jni 包名+類名