android-jni RegisterNatives注冊本地方法

RegisterNatives的使用方法

在Android中通過jni調(diào)用本地方法(c/c++)去枷,通常使用javah生成規(guī)范的頭文件,定義一個(gè)函數(shù)實(shí)現(xiàn)本地方法堵泽,函數(shù)名必須使用本地方法的全類名的規(guī)范來寫井誉。

Java_ + 包名 + 類名+ 接口名

注意名字之間用下劃線抡句,下面是示例:
JNIEXPORT jstring Java_com_example_test_MainActivity_helloworld(JNIEnv *, jclass );

有沒有覺得這種寫法太反人類了,其實(shí)jni還提供了RegisterNative函數(shù)手動(dòng)的注冊native方法赋秀,該方法可以自由命名函數(shù)利朵,不必像上述方法那樣拘泥特定煩雜的命名方式。
RegisterNatives使用示例:

static int registerNativeMethods(JNIEnv* env)
{
    jclass clazz;
    clazz = env->FindClass("com/example/test/MainActivity");
    if (clazz == NULL) {
        return JNI_FALSE;
    }
    if (env->RegisterNatives(clazz, gMethods, sizeof(gMethods) / sizeof(gMethods[0])) < 0) {
        return JNI_FALSE;
    }

    return JNI_TRUE;
}

RegisterNatives中第二個(gè)參數(shù)gMethods是一個(gè)二維數(shù)組猎莲,代表著這個(gè)class里的每一個(gè)native方法所對應(yīng)的實(shí)現(xiàn)的方法绍弟。寫法如下示例:

static JNINativeMethod gMethods[] = {
    {"helloworld", "()Ljava/lang/String;", (void*)Jni_helloworld}};

第三個(gè)參數(shù)代表要指定的native的數(shù)量。
這時(shí)將前面在jni中聲明的

jstring JNIEXPORT jstring Java_com_example_test_MainActivity_helloworld(JNIEnv *, jclass );

改為

jstring helloworld(JNIEnv *, jclass);

是不是清爽了很多著洼!

JNI字段描述符

在使用RegisterNatives注冊本地方法中比較容易出錯(cuò)的地方就是JNINativeMethod gMethods[]其中的()Ljava/lang/String;樟遣。
先解釋下()Ljava/lang/String;的含義,它是一種對函數(shù)返回值和參數(shù)的編碼身笤,這種編碼叫做JNI字段描述符(JavaNative Interface FieldDescriptors)年碘。
JNI字段描述符的規(guī)則是在括號(hào)里放置參數(shù),在括號(hào)后面放置返回類型:

(參數(shù)描述符)返回類型

例如()Ljava/lang/String;表示對應(yīng)的java中的helloworld方法無傳入?yún)?shù)展鸡,返回類型為String屿衅,即String helloworld();
這個(gè)示例可能過于簡單,下面再舉幾個(gè)例子:
(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/String;表示String f(String a,Object b);
([B)Ljava/lang/String;表示String f(byte [] bytes);這里B表示java中的byte類型莹弊,[表示數(shù)組涤久,[B表示byte []
以此類推忍弛,
[Ljava/lang/String;表示String []
[Ljava/lang/Object;表示Object[]
如果是二維數(shù)組int[][],用[[I表示响迂。
另外要注意的是,引用類型(除基本類型的數(shù)組外)通常以"L"開頭细疚,以";"結(jié)尾蔗彤,中間是用"/" 隔開的包及類名。所以";"分號(hào)是屬于引用類型的一部分,因此參數(shù)中如果有多個(gè)參數(shù)的話是不用;間隔的然遏。如:
(BI)V表示void f(byte b, int i);
(ILjava/lang/String;)V表示void f(int i,String s);

最后附上java類型與jni中字符對應(yīng)的關(guān)系表:

Java 類型 符號(hào)
Boolean Z
Byte B
Char C
Short S
Int I
Long J
Float F
Double D
Void V
objects對象 L開頭贫途,以;結(jié)尾,中間是用/ 隔開的包及類名待侵。比如:Ljava/lang/String;如果是嵌套類丢早,則用$來表示嵌套。例如 (Ljava/lang/String;Landroid/os/FileUtils$FileStatus;)Z
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末秧倾,一起剝皮案震驚了整個(gè)濱河市怨酝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌那先,老刑警劉巖农猬,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異售淡,居然都是意外死亡斤葱,警方通過查閱死者的電腦和手機(jī)准谚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門性湿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人阵赠,你說我怎么就攤上這事楔壤『追龋” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵蹲嚣,是天一觀的道長递瑰。 經(jīng)常有香客問我,道長隙畜,這世上最難降的妖魔是什么抖部? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮议惰,結(jié)果婚禮上慎颗,老公的妹妹穿的比我還像新娘。我一直安慰自己言询,他們只是感情好俯萎,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著运杭,像睡著了一般夫啊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上辆憔,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天撇眯,我揣著相機(jī)與錄音报嵌,去河邊找鬼。 笑死熊榛,一個(gè)胖子當(dāng)著我的面吹牛锚国,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播来候,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼跷叉,長吁一口氣:“原來是場噩夢啊……” “哼逸雹!你這毒婦竟也來了营搅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤梆砸,失蹤者是張志新(化名)和其女友劉穎转质,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體帖世,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡休蟹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了日矫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赂弓。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖哪轿,靈堂內(nèi)的尸體忽然破棺而出盈魁,到底是詐尸還是另有隱情,我是刑警寧澤窃诉,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布杨耙,位于F島的核電站,受9級(jí)特大地震影響飘痛,放射性物質(zhì)發(fā)生泄漏珊膜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一宣脉、第九天 我趴在偏房一處隱蔽的房頂上張望车柠。 院中可真熱鬧,春花似錦塑猖、人聲如沸竹祷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽溶褪。三九已至,卻和暖如春践险,著一層夾襖步出監(jiān)牢的瞬間猿妈,已是汗流浹背吹菱。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留彭则,地道東北人鳍刷。 一個(gè)月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像俯抖,于是被迫代替她去往敵國和親输瓜。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

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

  • _ 聲明: 對原文格式以及內(nèi)容做了細(xì)微的修改和美化, 主要為了方便閱讀和理解 _ 一. 基礎(chǔ) Java Nativ...
    元亨利貞o閱讀 5,921評論 0 34
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法芬萍,類相關(guān)的語法尤揣,內(nèi)部類的語法,繼承相關(guān)的語法柬祠,異常的語法北戏,線程的語...
    子非魚_t_閱讀 31,631評論 18 399
  • 這個(gè)周六,我終于推掉了一個(gè)“朋友”的邀約漫蛔,謊稱加班嗜愈。這是我終于忍無可忍的情況下,因?yàn)槲腋杏X不舒服莽龟。 這位女朋友每個(gè)...
    求無1824閱讀 372評論 2 0
  • 可能是個(gè)人習(xí)慣吧毯盈!每天都想寫點(diǎn)什么剃毒,無論今天經(jīng)歷了什么,無論多晚奶镶!跟別人一起分享是一方面迟赃,另一方面自己也能有所...
    大蔥love閱讀 563評論 3 0
  • 華麗的水晶燈投下淡淡的光,使整個(gè)餐廳顯得優(yōu)雅而靜謐厂镇。柔和的薩克斯曲充溢著整個(gè)餐廳纤壁,如一股無形的煙霧在蔓延著,慢慢地...
    藍(lán)木格子L閱讀 377評論 2 8