JNI开发流程的步骤
第1步:在Java中先声明一个native方法
第2步:编译Java源文件javac得到.class文件
第3步:通过javah -jni命令导出JNI的.h头文件
第4步:使用Java需要交互的本地代码,实现在Java中声明的Native方法(如果Java需要与C++交互,那么就用C++实现Java的Native方法。)
第5步:将本地代码编译成动态库(Windows系统下是.dll文件,如果是Linux系统下是.so文件,如果是Mac系统下是.jnilib)
第6步:通过Java命令执行Java程序,最终实现Java调用本地代码。
作用域
JNI接口指针仅在当前线程中起作用
JNIEnv是什么?
JNIEnv是一个线程相关的结构体,该结构体代表了Java在本线程的执行环境
JNIEnv和JavaVM的区别:
- JavaVM:JavaVM是Java虚拟机在JNI层的代表,JNI全局仅仅有一个
- JNIEnv:JavaVM 在线程中的代码,每个线程都有一个,JNI可能有非常多个JNIEnv;
JNIEnv的作用:
- 调用Java 函数:JNIEnv代表了Java执行环境,能够使用JNIEnv调用Java中的代码
- 操作Java代码:Java对象传入JNI层就是jobject对象,需要使用JNIEnv来操作这个Java对象
native 方法的注册
-
静态注册:本地方法名为java的方法名+包名路径
-
动态注册:可以自定义关联
JNI_OnLoad
JNI规范中定义了三种引用
- 局部引用(Local Reference)
- 全局引用(Global Reference)
- 弱全局引用(Weak Global Reference)
JNI开发之局部引用、全局引用和弱全局引用
网友评论