2.深入理解Android卷I---深入理解JNI

深入理解JNI https://blog.csdn.net/Innost/article/details/47204557
目前没有具体研究JNI层,故只了解下面这些内容。
· Java世界对应的是MediaScanner,而这个MediaScanner类有一些函数是需要由Native层实现的。
· JNI层对应的是libmedia_jni.so。media_jni是JNI库的名字,其中,下划线前的“media”是Native层库的名字,这里就是libmedia库。下划线后的”jni“表示它是一个JNI库。注意,JNI库的名字可以随便取,不过Android平台基本上都采用“lib模块名_jni.so”的命名方式。
· Native层对应的是libmedia.so库完成了实际的功能。
· MediaScanner将通过JNI库libmedia_jni.so和Native的libmedia.so交互。
通过上面的例子可以看出JNI层是Java层和Native层交互的桥梁。


JNI库的加载:
Java要调用Native函数,就必须通过一个位于JNI层的动态库才能做到。顾名思义,动态库就是运行时加载的库,那么是什么时候,在什么地方加载这个库呢?
这个问题没有标准答案,原则上是在调用native函数前,任何时候、任何地方加载都可以。通行的做法是,在类的static语句中加载,通过调用System.loadLibrary方法就可以了。这一点,在上面的代码中也见到了,我们以后就按这种方法编写代码即可。另外,System.loadLibrary函数的参数是动态库的名字,即media_jni。系统会自动根据不同的平台拓展成真实的动态库文件名,例如在Linux系统上会拓展成libmedia_jni.so,而在Windows平台上则会拓展成media_jni.dll。

Java的native函数和总结
从上面代码中可以发现,native_init和processFile函数前都有Java的关键字native,它表示这两个函数将由JNI层来实现。
Java层的分析到此结束。JNI技术也很照顾Java程序员,只要完成下面两项工作就可以使用JNI了,它们是:
· 加载对应的JNI库。
· 声明由关键字native修饰的函数。


注册JNI函数
正如代码中注释的那样,native_init函数对应的JNI函数是android_media_MediaScanner_native_init,可是细心的读者可能要问了,你怎么知道native_init函数对应的是这个android_media_MediaScanner_native_init,而不是其他的呢?莫非是根据函数的名字?
大家知道,native_init函数位于android.media这个包中,它的全路径名应该是android.media.MediaScanner.native_init,而JNI层函数的名字是android_media_MediaScanner_native_init。因为在Native语言中,符号“.”有着特殊的意义,所以JNI层需要把“.”换成“_”。也就是通过这种方式,native_init找到了自己JNI层的本家兄弟android.media.MediaScanner.native_init。
上面的问题其实讨论的是JNI函数的注册问题,“注册”之意就是将Java层的native函数和JNI层对应的实现函数关联起来,有了这种关联,调用Java层的native函数时,就能顺利转到JNI层对应的函数执行了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值