今天写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.大家有什么疑问,欢迎讨论