NDK開發(fā)之JNI基礎(chǔ)

JNI

JNI是Java Native Interface的縮寫辅甥,它提供了若干的API實(shí)現(xiàn)了Java和其他語言的通信(主要是C&C++)

什么時(shí)候使用JNI

當(dāng)Java層無法滿足功能需求的時(shí)候,或者對性能要求很高時(shí)候凡资,往往會使用JNI

NDK

工具的集合唧龄。幫助開放者快速開放C/C++ 動態(tài)庫的工具嗤疯。

JNI的開發(fā)流程

步驟:

  1. 編寫native 方法
  2. 在cpp目錄下實(shí)現(xiàn)native方法沸毁,對應(yīng)的方法名為(java_類的全名_方法名)
  3. 生成一個(gè)動態(tài)庫
  4. 在java中加載動態(tài)庫
  5. 觸發(fā)native函數(shù)

JNIEnv

JNIEnv實(shí)際上表示的是Java運(yùn)行環(huán)境谨朝,在JNI中經(jīng)常使用的env其實(shí)是一個(gè)指針,通過它就可以對Java端進(jìn)行操作佩捞。例如绞幌,創(chuàng)建Java對象,調(diào)用Java方法等一忱。

  • 在C中莲蜘,env 是二級指針
  • 在C++中谭确,env 是一級指針

每個(gè)jni中的native方法,都至少有兩個(gè)參數(shù)(JNIEnv * , jclass/jobject)
jclass: native 靜態(tài)方法
jobject: native 非靜態(tài)方法

Java和JNI中類型對應(yīng)關(guān)系

Java類型 本地類型 字節(jié)(bit)
boolean jboolean 8, unsigned
byte jbyte 8
char jchar 16, unsigned
short jshort 16
int jint 32
long jlong 64
float jfloat 32
double jdouble 64
void void n/a

JNI中C調(diào)用Java

調(diào)用普通方法

步驟

  1. 找到j(luò)ava對應(yīng)的class票渠,傳入的參數(shù)是JNIEnv指針和Java文件的完整路徑
jclass jclazz = (*env)->FindClass(env,"com/demo/tianyl/CCallJava");
  1. 找到對應(yīng)的方法逐哈,傳入的參數(shù)是JNIEnv指針和Java的class對象還有方法簽名,其中方法簽名按照(參數(shù))返回值的字符串傳入
jmethodID methodid = (*env)->GetMethodID(env, jclazz,"callJava","()V");

Java中方法簽名對應(yīng)關(guān)系

特殊字符 數(shù)據(jù)類型 說明
V void 一般用于方法的返回值
Z boolean
B byte
C char
S short
I int
J long
F float
D double
[ 數(shù)組 以[開頭问顷,配合其他的特殊字符昂秃,表示對應(yīng)數(shù)據(jù)類型的數(shù)組,幾個(gè)[表示幾維數(shù)組
L全類名; 引用類型 以L開頭杜窄,;結(jié)尾肠骆,中間是引用類型的全類名
  1. 調(diào)用方法
(*env)->CallVoidMethod(env,obj,methodid);

在調(diào)用方法時(shí),因?yàn)檫@里是非靜態(tài)的方法羞芍,所以傳入對應(yīng)的Java object對象哗戈,并且使用CallVoidMethod,如果是靜態(tài)的方法荷科,則是傳入class對象唯咬,并使用CallStaticObjectMethod

調(diào)用構(gòu)造方法

調(diào)用構(gòu)造方法其實(shí)就是調(diào)用了一個(gè)靜態(tài)的普通方法,大體流程基本一致
步驟

  1. 找到j(luò)ava對應(yīng)的class畏浆,傳入的參數(shù)是JNIEnv指針和Java文件的完整路徑
jclass jclazz = (*env)->FindClass(env,"com/demo/tianyl/Test");
  1. 找到對應(yīng)的方法胆胰,這里是靜態(tài)方法,所以需要使用GetStaticMethodID刻获,傳入的參數(shù)是JNIEnv指針和Java的class對象還有方法簽名蜀涨,其中方法簽名按照(參數(shù))返回值的字符串傳入
jmethodID methodid = (*env)->GetStaticMethodID(env, jclazz,"<init>","()V");
  1. 調(diào)用方法
    如果是需要使用構(gòu)造方法創(chuàng)建對象,那么就不能直接使用CallVoidMethod之類的方法了蝎毡,需要使用NewObject方法
jobject jobj = (*env)->NewObject(env,obj,methodid);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末厚柳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子沐兵,更是在濱河造成了極大的恐慌别垮,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,002評論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扎谎,死亡現(xiàn)場離奇詭異碳想,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)毁靶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評論 3 400
  • 文/潘曉璐 我一進(jìn)店門胧奔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人预吆,你說我怎么就攤上這事龙填。” “怎么了?”我有些...
    開封第一講書人閱讀 169,787評論 0 365
  • 文/不壞的土叔 我叫張陵岩遗,是天一觀的道長胶背。 經(jīng)常有香客問我,道長喘先,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,237評論 1 300
  • 正文 為了忘掉前任廷粒,我火速辦了婚禮窘拯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘坝茎。我一直安慰自己涤姊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,237評論 6 398
  • 文/花漫 我一把揭開白布嗤放。 她就那樣靜靜地躺著思喊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪次酌。 梳的紋絲不亂的頭發(fā)上恨课,一...
    開封第一講書人閱讀 52,821評論 1 314
  • 那天,我揣著相機(jī)與錄音岳服,去河邊找鬼剂公。 笑死,一個(gè)胖子當(dāng)著我的面吹牛吊宋,可吹牛的內(nèi)容都是我干的纲辽。 我是一名探鬼主播,決...
    沈念sama閱讀 41,236評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼璃搜,長吁一口氣:“原來是場噩夢啊……” “哼拖吼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起这吻,我...
    開封第一講書人閱讀 40,196評論 0 277
  • 序言:老撾萬榮一對情侶失蹤吊档,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后橘原,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體籍铁,經(jīng)...
    沈念sama閱讀 46,716評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,794評論 3 343
  • 正文 我和宋清朗相戀三年趾断,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拒名。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,928評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡芋酌,死狀恐怖增显,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤同云,帶...
    沈念sama閱讀 36,583評論 5 351
  • 正文 年R本政府宣布糖权,位于F島的核電站,受9級特大地震影響炸站,放射性物質(zhì)發(fā)生泄漏星澳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,264評論 3 336
  • 文/蒙蒙 一旱易、第九天 我趴在偏房一處隱蔽的房頂上張望禁偎。 院中可真熱鬧,春花似錦阀坏、人聲如沸如暖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盒至。三九已至,卻和暖如春士修,著一層夾襖步出監(jiān)牢的瞬間枷遂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評論 1 274
  • 我被黑心中介騙來泰國打工棋嘲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留登淘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,378評論 3 379
  • 正文 我出身青樓封字,卻偏偏與公主長得像黔州,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子阔籽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,937評論 2 361

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