这一章在整本书里面处于什么位置呢?我的理解是:这一章讲的是JNI,可是没讲Dalvik,只讲了Java与Native语言之间如何调用。
首先,以MediaScanner为例,分析了Java、JNI与Native的关系。在MediaScanner.java中,有两个地方是跟调用JNI有关的。第一个是System.loadLibraly("media_jni"),通常的做法是在类的static语句中像这样加载JNI库;第二个是声明一个native函数,即这里是native_init(),注意声明需要native关键字。这部分是搞Java的人要做的,好吧,底层开发者就没那么幸运了,接着看。
书中提到两种注册JNI函数的方法:
一种是静态方法,需要javah工具生成头文件,按照名称来JNI库里面找匹配对象,具体规则就不说了,自己看书去。
另一种是动态注册,首先用一个JNINativeMethod结构体保存native函数名与函数签名还有JNI层对应的函数指针,具体规则还是看看书好了,不废话。然后用AndroidRunTime类的registerNativeMethod函数完成注册工作。接下去不得不感叹Java程序员真幸福,Android平台提供了了一个jniRegisterNativeMethod的函数,在JNIHelp.c里把相应的参数如JNINativeMethod结构体填好就可以完成动态注册。接着书上还提到这些动态注册函数什么时候被调用,就是在System.loadLibrary加载完JNI动态库后,查找该库中的JNI_OnLoad函数。如果有,调用它。
接着书里提到JNIEnv、JavaVM、jString、JNI类型签名、垃圾回收、异常处理这些东西,这里提一些比较有意思的地方:JNIEnv每线程只有一个,JNI技术有三种类型的引用(Local、Global、Weak Global)、Java层怎样调用Java函数(JNIEnv的CallVoidMethod)。
阅读(1888) | 评论(0) | 转发(0) |