簡介:
通過源碼,我們來一步步分析Mapbox地圖引擎原生庫加載的流程,這里是基于5.3.0的版本.
當(dāng)在代碼中調(diào)用System.loadLibrary函數(shù)時,該函數(shù)會找到對應(yīng)的動態(tài)庫,然后找到"JNI_OnLoad"函數(shù),如果該函數(shù)存在孽锥,則調(diào)用它,這里我們看到原生庫下有一個main.cpp文件中包含這個方法细层,即這是庫加載的入口
這里我們看到它調(diào)用了registerNatives函數(shù)惜辑,我們在它包含的jni.cpp中找到該函數(shù)
這里我們看到,它對底層相關(guān)類進(jìn)行了注冊今艺,這里我們隨便找一個類看一下韵丑,例如FileSource類,我們找到file_source.cpp文件
看到這里我們就看到了很多不熟悉的方法了虚缎,例如*jni.Class<>,Find(),NewGlobalRel(),RegisterNativePeer<>等撵彻,但即時如此,我們大概能看出這是找到對應(yīng)類实牡,并進(jìn)行注冊陌僵,我們看到這些方法都來自一個jni.hpp這個包里,我們在mason_packages包下面的headers包找到這些第三方引入的包创坞,其中便有jni.hpp,那什么時候?qū)脒@個包的呢碗短,這里我們返回根目錄找到platform.android包下config.cmake文件,其中便有這么一行
mason_use(jni.hpp VERSION 3.0.0 HEADER_ONLY)
我們找到j(luò)ni.hpp包下面的readme文件查看介紹题涨,這是一個用c++14封裝的新的類型安全偎谁,僅包含頭部文件的jni庫,比較方便的進(jìn)行c++與java之間的調(diào)用等纲堵,下面是jni.hpp的github地址,相關(guān)使用這個庫的細(xì)節(jié)巡雨,這里就不一一介紹了.
<https://github.com/mapbox/jni.hpp/>