1 什么是JNI和NDK?
JNI:java本地接口
NDK(Native Development Kit)是Google提供的一套工具集,主要通过修改mk文件用它编译多平台so库
JNI开发目的: 性能问题考虑 保护核心算法和处理逻辑 移植问题 开源库
2 2.2之前JNI 开发流程主要分为以下 6 步:
1、编写声明了 native 方法的 Java 类
2、将 Java 源代码编译成 class 字节码文件
3、用 javah -jni 命令生成.h头文件(javah 是 jdk 自带的一个命令,-jni 参数表示将 class 中用native 声明的函数生成 JNI 规则的函数)
4、用本地代码实现.h头文件中的函数
5、将本地代码编译成动态库(Windows:\*.dll,linux/unix:\*.so,mac os x:\*.jnilib)
6、拷贝动态库至 java.library.path 本地库搜索目录下,并运行 Java 程序
本例以cmake脚本构建的方式创建C/C++工程
4 java数据类型与native数据类型的映射关系
1、Java 与 JN I数据类型的对应关系其实就是差一个字母j,例如jboolean------boolean,其它基本类型以此类推, jobjectArray-----object[], jintArray---int[]........
2、Java 基本类型与JNI方法签名中参数类型和返回值类型的映射关系采用首字母大写的对应方式,例如 I---int, D---double...... 比较特别的是boolean---Z , long---J 引用类型对应到JNI层的格式是: L+类全限定名+;
5 java方法和Nativie方法的映射
public native int add(int num1, int num2)
JNIEXPORT jint JNICALL Java_com_jnidemo_add(JNIEnv *env, jobject jobj, jint num1,jint num2)
6 JNI与Java层的数据传递处理
数据类型转换
JNI层基本数据类型: 直接使用
JNI引用数据类型: 函数表中选择合适的 JNI 函数来操作 JVM 中的数据结构
JNI访问java层代码
访问静态方法:jclass---> jmethodID---->CallStaticXXXMethod
回调实例方法:jclass-->jmethodID(构造方法)--->jobject---->jmethodID(实例方法)
-->CallXXXMethod
Native线程回调: 开启新的Native Thread-->将当前线程附加到虚拟机并获取JNI环境指针--> 回调实例方法