1.生成动态库.so,存放于手机的system/lib/中(APP怎样将.so存入该文件夹,
奇怪?????),Java层调用JNI的类会运行静态代码
System.loadLibrary("***")将手机的system/lib文件夹中的动态库载入到VM。
2..so动态库里,C组件开发人员通过
JNI_OnUnload()函数进行初始化。当然。老版的JNI是没有JNI_OnUnload()函数的,从而VM也能依据有无该函数推断JNI是新版or老版。
3.JNI_OnUnload()函数还能将.so提供的各个本地函数登记(如何的登记过程???)到VM里,以便能加快兴许呼叫本地函数的效率。
4.正如在加载.so时会马上呼叫JNI_OnLoad()来进行组件内的初始化;当VM释放该C组件时。也会呼叫JNI_OnUnload()函数来进行善后清除动作。
5.关于JNIEnv的个人理解:比如多个线程中创建了同一个类的对象,并调用对象的native方法,这时会向native方法传递一个參数JNIEnv,表明native方法方法所执行的环境即该native方法执行在哪个线程。