2014年9月10日星期三

native method与so中function的关联 - rainduck

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
native method与so中function的关联 - rainduck  阅读原文»

在Android中,可以通过JNI的方式来调用和访问用C/C++实现的代码,这些代码以SharedLibrary的方式存在于so中。从Java Code到Native Code的一般使用过程为:

  1. 在Java中的某个类中调用System.loadLibrary(XXX)(对于ing的so的全名应为:libXXX.so),或者System.load(soPathName)(soPathName对应于要加载的某个so的完整路径及文件名)来加载so;
  2. 声明所要调用的静态方法,即需要和so中函数关联的方法名:需要关键字native
  3. 编写so,实现声明的native method的功能。
  4. 与nativeMethod进行关联:1)使用符合JNI规范的JNI Name String来作为so中的对应函数的函数名:一般为class_name_method_name的形式;2)在JNI_OnLoad中调用jniRegisterNativeMethods手动注册,一半对于每个method需要提供信息:methodName, method signature, function(pointer).

本文则是总结native Method与so中的function如何建立关联关系的:jin native method的注册。对于完整注册过程可参考老罗的博文Dalvik虚拟机JNI方法的注册过程分析,其中已有详尽的介绍。

通过jniRegisterNativeMethods的注册

这个方式的注册,是用户在JNI_OnLoad中主动注册完成的。重新学习注册过程,了解了method的管理方法和调用方式。 注册过程就是一个将native function绑定到一个native method,准确点说应该是将该native method结构中的DalvikBidgeFunc nativeFunc赋值为某一个jniBridge函数,然后将ins赋值为native function的函数地址。然后再调用时通过调用nativeFunc,即bridge函数,在此基础上基于libffi,实现跨平台无差异化调用真正的对应的native function。 关于java 中method的结构可参考对Java中method和class的管理和组织方法。

在注册过程中会,会根据注册提供的信息--className、MethodName去发射获取对象,查看需要绑定的对象和native method是否存在。

符合jni specification的本地函数的查找过程

相关代码位于:dalvik/vm/native.cpp

由于此种方式的调用,java中的native method中的nativeFunc被初始化的设置为dvmResolveNativeMethod;(实际上每个method都被初始化为dvmResolveNativeMethod)。

所以首次运行时会调用dvmResolveNativeMethod尝试去内部( dvmLookupInternalNativeMethod(method))以及已加载的so中尝试获取该相应的函数地址( lookupSharedLibMethod(method), 实际搜索过程在findMethodInLib中完成).如果是在lib中找到, 则通过dvmUseJNIBridge将method中的nativeFunc设置为相应的Bridge函数,ins设为func地址。

此后则无需搜索过程,直接调用即可。

对于在so中的函数搜索,判断依据是lib和method有相同的classLoader,且method对应的JNI name string的函数存在于lib中.(这通过dlopen和dlsym尝试获取地址来判断)。

参考

  1. 老罗 Dalvik虚拟机JNI方法的注册过程分析
  2. AOSP source code

本文链接:native method与so中function的关联,转载请注明。

个人专著《企业级GIS设计管理优化策略》已经出版等待您的选购 - 尤文之鹤  阅读原文»

【摘要】正如2014年中央电视台春节晚会上的一首《时间都去哪了》,听完也会感叹自己的时间都去哪了。从我2010年真正接触和研究企业级地理数据库及其密切的相关方向已经四年时间了,本书提及的企业级地理数据库技术就是以Esri的ArcSDE技术、Geodatabase技术为核心,以及相关的数据库技术(Oracle... 阅读全文

阅读更多内容

没有评论:

发表评论