今天寫JNI Demo搞了一天,其中遇到了許多錯誤,不過一一解決了,下面是我根據網上總結的開發過程:
0.配置ndk路徑
在project項目的local.properties裏面加上ndk路徑
ndk.dir=D\:\\NDK\\android-ndk-r11b
1.在project 下的gradle.properties,裏面加上:
android.useDeprecatedNdk=true
2.在app 的build.gradle的
defaultConfig裏面加入
ndk { moduleName "JniTest" ldLibs "log", "z", "m" abiFilters "armeabi", "armeabi-v7a", "x86" }
moduleName 就是so庫的庫名。第二行打印log,第三行是支持的體系架構,完整如下
3.我們寫本地方法(可以單獨創建類,也可以直接在已有的類裏面寫),
4.調用本地方法,然後build項目(我此處,點擊button,改變textview的文本),你會在 項目名\app\build\intermediates\classes\debug\(項目包名) 下找到生成的class文件
5.最重要的一步:打開as 的terminal,進入 項目名\app的main目錄下,輸入:
javah -d jni -classpath <SDK_android.jar>;<APP_classes> education.bbk.com.myapplication.TestJJ
我的是:
此時你會發下生成了.h文件
6.創建main.c文件(文件命任意),打開.h文件,我們複製方法名過來,寫好的如下,我們再次build
* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> #include <android/log.h> #ifndef LOG_TAG #define LOG_TAG "ANDROID_LAB" #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__) #endif /* Header for class lab_sodino_jnitest_MainActivity */ #ifndef _Included_lab_sodino_jnitest_MainActivity #define _Included_lab_sodino_jnitest_MainActivity #ifdef __cplusplus extern "C" { #endif /* * Class: lab_sodino_jnitest_MainActivity * Method: getStringFromNative * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_education_bbk_com_myapplication_TestJJ_getString (JNIEnv * env, jobject jObj){ LOGE("log string from ndk."); return (*env)->NewStringUTF(env,"Hello From JNI!"); } #ifdef __cplusplus } #endif #endif
7.buid後,我們發現已經生成了so包,然後在代碼中加載庫:
static { System.loadLibrary("JniTest"); }
8.運行項目,點擊按鈕,c代碼成功調用
9.大家有什麼疑問,歡迎討論