JNI原理

JNI實(shí)現(xiàn)原理

JNI系列:JavaVM和JNIEnv等原理
http://blog4jimmy.com/2017/11/242.html
http://blog4jimmy.com/category/the_java_native_interface_programmer_guide_and_specificationjni
http://blog.guorongfei.com/2017/01/24/android-jni-tips-md/
https://www.cnblogs.com/fnlingnzb-learner/p/7366025.html
https://www.zybuluo.com/cxm-2016/note/566619
https://blog.csdn.net/omnispace/article/details/73320940
反射:
http://blog4jimmy.com/2017/11/224.html

http://androidxref.com/8.0.0_r4/xref/libnativehelper/include/nativehelper/jni.h

插件機(jī)制:
https://github.com/tiann/epic/tree/master/library/src/main/cpp
https://blog.csdn.net/omnispace/article/details/73320940

JNI的實(shí)現(xiàn)可涉及兩個關(guān)鍵類:JNIEnv和JavaVM闰蚕。
JavaVM:這個代表java的虛擬機(jī)霹崎。所有的工作都是從獲取虛擬機(jī)的接口開始的雷酪。
第一種方式阿宅,在加載動態(tài)鏈接庫的時候嚼酝,JVM會調(diào)用JNI_OnLoad(JavaVM* jvm, void* reserved)(如果定義了該函數(shù))。第一個參數(shù)會傳入JavaVM指針扰魂。
第二種方式蝶桶,在native code中調(diào)用JNI_CreateJavaVM(&jvm, (void*)&env, &vm_args)可以得到JavaVM指針。
兩種情況下爱榔,都可以用全局變量被环,比如JavaVM
g_jvm來保存獲得的指針以便在任意上下文中使用。
Android系統(tǒng)是利用第二種方式Invocation interface來創(chuàng)建JVM的详幽。

JNIEnv:JNI Interface Pointer, 是提供JNI Native函數(shù)的基礎(chǔ)環(huán)境筛欢,線程相關(guān),不同線程的JNIEnv相互獨(dú)立唇聘。
?JNIEnv只在當(dāng)前線程中有效版姑。本地方法不 能將JNIEnv從一個線程傳遞到另一個線程中。相同的 Java 線程中對本地方法多次調(diào)用時迟郎,傳遞給該本地方法的JNIEnv是相同的剥险。但是,一個本地方法可被不同的 Java 線程所調(diào)用宪肖,因此可以接受不同的 JNIEnv表制。

     JavaVM則可以在進(jìn)程中的各線程間共享。理論上一個進(jìn)程可以有多個JavaVM,但Android只允許一個(JavaVm and JIEnv)控乾。需要強(qiáng)調(diào)的是JNIEnv是跟線程相關(guān)的么介。sdk文檔中強(qiáng)調(diào)了do not cache JNIEnv*,要用的時候在不同線程中再通過JavaVM *jvm的方法來獲取與當(dāng)前線程相關(guān)的JNIEnv*蜕衡。兩者都可以理解為函數(shù)表(Function Pointer Table), 前者是使用Java程序創(chuàng)建的運(yùn)行環(huán)境(從屬于一個JVM)提供JNI Native函數(shù)壤短。

注意點(diǎn):
http://www.10tiao.com/html/330/201711/2653579453/1.html

pthread_key:
https://zhuanlan.zhihu.com/p/33411235

http://blog.csdn.net/zsl_oo7/article/details/71081291
http://wiki.jikexueyuan.com/project/jni-ndk-developer-guide/function.html

## 調(diào)用Java層的方法

1.  通過 `jclass clazz = env->FindClass("含有路徑的類名");` 找到類
2.  通過 `jmethodID mid = env->GetMethodID(clazz,"方法名","方法簽名信息");`找到Java層方法的ID 

    *   注意 jmethodID 是一個專門記錄 Java 層方法的類型
    *   類似的還有一個 jfieldID
3.  通過 `env->CallxxxMethod(jobj,mid,param1,param2...);` 調(diào)用 Java 層的方法 

    *   CallxxxMethod 中的 xxx 是 Java 方法的返回值類型,比如 CallVoidMethod慨仿,CallIntMethod
    *   第一個參數(shù)是指調(diào)用哪個對象的方法久脯,就是 Java 中`.`前面的那個對象
    *   第二個參數(shù) Java 中的 MethodID
    *   后面的參數(shù)就是 Java 方法的參數(shù)了,其類型都要是 java 中能處理的類型镰吆,比如 jstring帘撰,jint,jobject

## get和set Java層的field

1.  通過 `jclass clazz = env->FindClass("含有路徑的類名");` 找到類
2.  通過 `jfieldID fid = env->GetFieldID(clazz,"成員名","成員類型標(biāo)示");`找到Java層成員變量的ID
3.  通過 `GetxxxField(env,obj,fid);` / `SetxxxField(env,obj,fid,value);` 來get/set相應(yīng)的成員變量

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鼎姊,一起剝皮案震驚了整個濱河市骡和,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌相寇,老刑警劉巖慰于,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異唤衫,居然都是意外死亡婆赠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進(jìn)店門佳励,熙熙樓的掌柜王于貴愁眉苦臉地迎上來休里,“玉大人,你說我怎么就攤上這事赃承∶钍颍” “怎么了?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵瞧剖,是天一觀的道長拭嫁。 經(jīng)常有香客問我,道長抓于,這世上最難降的妖魔是什么做粤? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮捉撮,結(jié)果婚禮上怕品,老公的妹妹穿的比我還像新娘。我一直安慰自己巾遭,他們只是感情好肉康,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著灼舍,像睡著了一般迎罗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上片仿,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天纹安,我揣著相機(jī)與錄音,去河邊找鬼砂豌。 笑死厢岂,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的阳距。 我是一名探鬼主播塔粒,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼筐摘!你這毒婦竟也來了卒茬?” 一聲冷哼從身側(cè)響起船老,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎圃酵,沒想到半個月后柳畔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡郭赐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年薪韩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捌锭。...
    茶點(diǎn)故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡俘陷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出观谦,到底是詐尸還是另有隱情拉盾,我是刑警寧澤,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布豁状,位于F島的核電站盾剩,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏替蔬。R本人自食惡果不足惜告私,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望承桥。 院中可真熱鬧驻粟,春花似錦、人聲如沸凶异。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽剩彬。三九已至酷麦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間喉恋,已是汗流浹背沃饶。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留轻黑,地道東北人糊肤。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像氓鄙,于是被迫代替她去往敵國和親馆揉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評論 2 359

推薦閱讀更多精彩內(nèi)容