Chinaunix首页 | 论坛 | 博客
  • 博客访问: 225673
  • 博文数量: 59
  • 博客积分: 1215
  • 博客等级: 少尉
  • 技术积分: 575
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-09 02:18
文章分类

全部博文(59)

文章存档

2012年(53)

2011年(6)

分类: 嵌入式

2012-01-17 22:41:09

    这一章在整本书里面处于什么位置呢?我的理解是:这一章讲的是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)。
     
阅读(1852) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~