Android-NDK开发中JNI动态注册
分析静态注册:
1.静态注册的时候,一个JAVA层方法(native声明的方法)会对应的一个固定的JNI层的函数(固定格式名称的签名函数)
固定格式名称的签名函数:Java_com_confused_testjni_dynamic_add
Java_包名_类名_方法名 (说白了就是路径java/com.confused.testjni/dynamic.add中间每个单词之间用'_'分割,
碰到单词里有'_'的改成 用'_1'分割)
2.JVM 是通过这个固定格式的名称才能来定位这个JNI层的函数,从而实现JAVA中native声明的方法.
在这个过程中 JNI层的签名函数 --> JAVA中native声明的方法 这两者中间通过某种固定格式的函数命名规则形成了对应关系
但是这种对应关系的弊端是,只能按照JNI规定好的命名规则,才能实现JAVA层方法和JNI层方法的一一对应.
3.当我们想要更加灵活地完成这种对应关系的注册,就需要考虑用动态注册了
4.动态注册简单来说就是,将上述静态注册的过程变得灵活可控(我们自己来规定这个函数命名规则),但同时也能够实现其中的对应关系
如何实现动态注册:
1.找到项目包(com.confused.testjin)
2.在项目包里新建一个JAVA类(Dynamic)
3.在这个类中声明native方法(dynamic_add(int v1,int v2): 需要调用JNI层实现的方法)
4.找到main文件夹里边的cpp文件夹
5.在这个文件夹里新建一个.c文件,文件名随意(最好能起到见名知意的效果)
6.回到刚才新建的JAVA类中,新增上静态加载代码块
7.在terminal里打开java这个文件夹
8.利用javah 命令生成对应的头文件(.h后缀)
在terminal中输入 Javah 包名.类名 例如: javah com.confused.testjin.Dynamic 然后回车运行,得到一个头文件.
9.将头文件中的全部内容拷贝到刚才在cpp文件夹中创建的.c文件中去
10.配置CMakelist.txt文件
注意:
1.add_libarary()中第一个.c文件名不带后缀,第二个带后缀名;
2.target_link_libraries()中的.c文件也不带后缀名;
11.开始编写.c文件
1.首先删除掉自动生成的静态注册用的代码
2.编写JNI层的方法(JAVA层native声明的那个方法想实现的逻辑都在这个函数里)
jint add(JNIEnv *jniEnv,jobject jobject1,jint jint1,jint jint2){
return jint1 + jint2;
};