问题背景
Android Studio对JNI的开发是越来越友好了,给Google老大哥大大的赞,AS升级到2.2以后就能通过CMake编译,十分方便,具体可参考官方网站https://developer.android.com/studio/projects/add-native-code,至于JNI编译的其他方式,比如ndk-build,可参考这个哥们的文章。好了说了这么多,并没有讲到今天文章的重点,哈哈,我们现在开始啦。
静态注册, 每个 class 都需要使用 javah 生成一个头文件,并且生成的名字很长书写不便;初次调用时需要依据名字搜索对应的JNI层函数来建立关联关系,会影响运行效率。所以这时候动态注册就登场了。
动态注册
一.入口函数
System.loadLibrary加载完 JNI 动态库之后,调用JNI_OnLoad函数,开始动态注册。这里就是登记注册的地方。注意:一个.so只能存在一个onload方法。
二.登记本地方法
登记本地方法,作用是将 c/c++ 的函数映射到 JAVA 中,而在这里面起到关键作用的是结构体 JNINativeMethod 。他再jni.h文件中
1 | typedef struct { |