简介:
通过源码,我们来一步步分析Mapbox地图引擎原生库加载的流程,这里是基于5.3.0的版本.
当在代码中调用System.loadLibrary函数时,该函数会找到对应的动态库,然后找到"JNI_OnLoad"函数,如果该函数存在,则调用它,这里我们看到原生库下有一个main.cpp文件中包含这个方法,即这是库加载的入口
这里我们看到它调用了registerNatives函数,我们在它包含的jni.cpp中找到该函数
这里我们看到,它对底层相关类进行了注册,这里我们随便找一个类看一下,例如FileSource类,我们找到file_source.cpp文件
看到这里我们就看到了很多不熟悉的方法了,例如*jni.Class<>,Find(),NewGlobalRel(),RegisterNativePeer<>等,但即时如此,我们大概能看出这是找到对应类,并进行注册,我们看到这些方法都来自一个jni.hpp这个包里,我们在mason_packages包下面的headers包找到这些第三方引入的包,其中便有jni.hpp,那什么时候导入这个包的呢,这里我们返回根目录找到platform.android包下config.cmake文件,其中便有这么一行
mason_use(jni.hpp VERSION 3.0.0 HEADER_ONLY)
我们找到jni.hpp包下面的readme文件查看介绍,这是一个用c++14封装的新的类型安全,仅包含头部文件的jni库,比较方便的进行c++与java之间的调用等,下面是jni.hpp的github地址,相关使用这个库的细节,这里就不一一介绍了.
<https://github.com/mapbox/jni.hpp/>