一、JNI和NDK区别
JNI:JNI是一套编程接口,用来实现Java代码与本地的C/C++代码进行交互;
NDK: NDK是Google开发的一套开发和编译工具集,可以生成动态链接库,主要用于Android的JNI开发; (Android平台一个实现JNI功能的工具包)
二、NDK优点
1.安全 相对于java的半解释语言 c反编译破解汇编的难度更大
2.高效 本地代码效率高 C语言能灵活操作内存
3.复用 编译好的so库 其它平台能通用
4.扩展性 JNI扩展了JVM能力,驱动开发,例如开发一个wifi驱动,可以将手机设置为无限路由
三、JNI篇
https://www.jianshu.com/p/ac00d59993aa
四、NDK篇
创建so库
1.配置 Android NDK环境 https://www.jianshu.com/p/8b67ba7ed598
2.在当前工程中新建目录(jni),并创建xx.cpp文件 , 添加c方法
JNIEXPORT void JNICALL
Java_com_afei_jnidemo_MainActivity_showDir(JNIEnv *env, jobject instance, jstring dirPath_) {
env->NewStringUTF("Hello i am from JNI!");
}
动态注册 JNIEXPORT 和 JNICALL实现
返回类型 void 其它类型可以在原有java类型头部添加小写j eg:String -> jstring
方法名 Java_包名_类名_调用方法名.(包名中.需要改为_)
参数 JNIEnv JNIEnv类型实际上代表了Java环境,通过这个JNIEnv* 指针,就可以对Java端的代码进行操作 JNIEnv的指针会被JNI传入到本地方法的实现函数中来对Java端的代码进行操作
3.在jni目录下新建Android.mk指定源码编译的配置信息
LOCAL_MODULE := hello_jni // 设置模块的名称,即编译出来.so文件名,要和上述步骤中build.gradle中NDK节点设置的名字相同
LOCAL_SRC_FILES := \ // 多个c++文件参与编译
test1.cpp \
test/ftest2.cpp \
test3.c \
LOCAL_SHARED_LIBRARIES := \ // 设置需依赖的.so文件
test1 \
Carsontest
4.在jni目录下新建Application.mk配置so库支持平台 默认armeabi x86 mips
APP_ABI 用于指定需生成的架构
APP_STL 用于指定在使用C++进行编程时所依赖的标准库
5.在jni目录执行ndk-build命令。(会生产对应lib文件夹 里面有前一步支持的so库)
使用so库
1.在目标文件写上
static{
System.loadLibrary(“so库名称”);
}
2.public native 定义返回类型 方法名称();
3.在业务点调用
参考
JNI 与 NDK:https://www.jianshu.com/p/38859f881888
Application.mk和Android.mk:https://blog.csdn.net/cgwang_1580/article/details/80719974
理解静态库与动态库:https://blog.csdn.net/wsq119/article/details/82285480
Android NDK 从入门到精通:https://blog.csdn.net/afei__/article/details/81290711
Android NDK 面试题汇总:https://blog.csdn.net/afei__/article/details/84889135