亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

JDK 的 JNI 的經(jīng)典使用

系統(tǒng) 2094 0

Java本地接口(Java Native Interface (JNI))允許運(yùn)行在Java虛擬機(jī)(Java Virtual Machine (JVM))上的代碼調(diào)用本地程序和類庫(kù),或者被它們調(diào)用,這些程序和類庫(kù)可以是其它語(yǔ)言編寫的,比如C、C 或者匯編語(yǔ)言。

當(dāng)一個(gè)程序無(wú)法完全使用Java編寫時(shí),開(kāi)發(fā)者可以通過(guò)JNI來(lái)編寫本地方法,比如標(biāo)準(zhǔn)Java類庫(kù)并不支持的依賴于平臺(tái)的特色或者程序庫(kù)。JNI還可以用于修改現(xiàn)有的使用其它語(yǔ)言編寫的程序,使它們可以通過(guò)Java編寫的程序來(lái)訪問(wèn)。

很多基本類庫(kù)都依賴JNI來(lái)為開(kāi)發(fā)者和用戶提供服務(wù),比如文件的輸入/輸出和音頻功能。在基本類庫(kù)中包含的對(duì)于性能和平臺(tái)敏感的API可以允許所有的Java程序以安全和平臺(tái)無(wú)關(guān)的方式來(lái)使用這些功能,在采用JNI之前,開(kāi)發(fā)者需要明確這些功能并不是已經(jīng)包含在Java標(biāo)準(zhǔn)類庫(kù)中的,在這篇文章中,我將會(huì)講解JNI是如何工作的以及本地類型是如何映射到Java的類型和類庫(kù)的。

JNI工作原理

在JNI中,本地函數(shù)是通過(guò)一個(gè)獨(dú)立的.c或.cpp文件來(lái)實(shí)現(xiàn)的(C 為JNI提供的界面會(huì)更簡(jiǎn)潔一些)。當(dāng)JVM調(diào)用該函數(shù)時(shí),它傳遞了一個(gè)JNIEnv指針、一個(gè)jobject指針和通過(guò)Java方法定義的Java參數(shù),JNI函數(shù)的形式如下:

JNIEXPORT void JNICALL Java_ClassName_MethodName

(JNIEnv *env, jobjectobj)

{

//Method native implemenation

}

env指針是一個(gè)包含了JVM接口的結(jié)構(gòu),它包含了與JVM進(jìn)行交互以及與Java對(duì)象協(xié)同工作所必需的函數(shù),示例中的JNI函數(shù)可以在本地?cái)?shù)組和Java數(shù)組類型之間、本地字符串和Java字符串類型之間進(jìn)行轉(zhuǎn)換,其功能還包括對(duì)象的實(shí)例化、拋出異常等。基本上您可以使用JNIEnv來(lái)實(shí)現(xiàn)所有Java能做到的事情,雖然要簡(jiǎn)單很多。

更加正式的解釋是這樣的,本地代碼通過(guò)調(diào)用JNI的函數(shù)來(lái)訪問(wèn)JVM,這是通過(guò)一個(gè)界面指針實(shí)現(xiàn)的(界面指針實(shí)際上是指向指針的指針),該指針指向一個(gè)指針數(shù)組,數(shù)組中的每個(gè)指針都指向了一個(gè)界面函數(shù),而每個(gè)界面函數(shù)都是在數(shù)組中預(yù)先定義過(guò)的。

本地方法將JNI界面指針當(dāng)作一個(gè)參數(shù),如果在同一個(gè)Java線程中,出現(xiàn)對(duì)該本地方法的多重調(diào)用,JVM則保證傳遞相同的界面指針到本地方法。不過(guò),一個(gè)本地方法可以被不同的Java線程調(diào)用,因而也可能會(huì)收到不同的JNI界面指針。

本地方法是通過(guò)System.loadLibrary方法加載的,在以下的例子中,類的初始化方法加載了一個(gè)指定平臺(tái)的本地類庫(kù),該類庫(kù)定義了本地方法:

packagepkg;

class Cls {

native double f(inti, String s);

static {

System.loadLibrary(pkg_Cls");

}

}

System.loadLibrary方法的參數(shù)是一個(gè)類庫(kù)的名稱,它可以由程序員任意選取,系統(tǒng)則遵循一個(gè)標(biāo)準(zhǔn)的本地化平臺(tái)的方式來(lái)轉(zhuǎn)換類庫(kù)的名稱到一個(gè)本地類庫(kù)的名稱。例如,在Solaris操作系統(tǒng)中會(huì)將pkg_Cls轉(zhuǎn)換為libpkg_Cls.so,而Win32系統(tǒng)則會(huì)將同樣的pkg_Cls轉(zhuǎn)換為pkg_Cls.dll。

動(dòng)態(tài)指針會(huì)根據(jù)它們的名字來(lái)進(jìn)行解析,一個(gè)本地方法的名稱是按照組件進(jìn)行連接的,它包含了:前綴“Java_”、一個(gè)分離的合法的類名稱和一個(gè)分離的方法名稱。

注意:微軟的JVM有相同的機(jī)制從Java調(diào)用本地Windows代碼,該機(jī)制被稱為原始本地接口(Raw Native Interface (RNI))。

數(shù)據(jù)類型映射



基本類型,比如整型、字符等等,是在Java和本地代碼間進(jìn)行拷貝的,而其他的自定義Java對(duì)象則是通過(guò)引用來(lái)傳遞的。



這個(gè)表格展示了Java和本地代碼之間的類型映射,這些類型是可以互換的,您可以在您使用int類型的位置使用jint類型,當(dāng)然反過(guò)來(lái)也一樣,而且不需要任何類型轉(zhuǎn)化。但是,Java的字符串和數(shù)組類型和本地的字符串與數(shù)組類型之間的轉(zhuǎn)換就比較困難了,如果您使用的jstring類型中出現(xiàn)了字符“*”,您的代碼會(huì)造成JVM的崩潰,以下的例子說(shuō)明了您應(yīng)當(dāng)如何正確使用字符串:

JNIEXPORT void JNICALL Java_ClassName_MethodName

(JNIEnv *env, jobjectobj, jstringjavaString)

{

//Get the native string from Java string

const char *nativeString = env->GetStringUTFChars(env,javaString, 0);

printf("%s", nativeString);

env->ReleaseStringUTFChars(env,javaString, nativeString);

}

您需要使用界面指針env來(lái)操作Java對(duì)象。

總結(jié)

在您的程序中使用JNI并不是一件容易的事情,然而,JNI的性能和使用原有代碼的能力將會(huì)為您的Java程序添加更多的功能并且能勝任更多的挑戰(zhàn),如果需要關(guān)于JNI的更多信息,可以訪問(wèn)JNI的主頁(yè)。

JDK 的 JNI 的經(jīng)典使用


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 久久久人体| 2022国内精品免费福利视频 | 在线韩日 | 日日摸夜夜添夜夜添人人爽 | 欧美成人免费午夜影视 | 久草在线视频资源 | 狠狠色丁香婷综合久久 | 久久精品30| 亚洲精品区 | 日韩在线免费视频观看 | 久久96国产精品久久久 | 特黄一级大片 | 久久精品久久久久久久久人 | 九九九| 日韩在线播放中文字幕 | 91在线精品亚洲一区二区 | 四虎影| 99精品在线免费观看 | aaa特级毛片 | 免费播放一区二区三区 | 欧美一区二区三区在线 | 国产一区二区在线 |播放 | 91在线视频在线观看 | 欧美日韩国产人成在线观看 | 欧美综合精品一区二区三区 | 久久伊人中文字幕 | julia紧身裙中文字幕在线看 | 亚洲精品午夜久久久伊人 | 色综合亚洲欧美在线 | 欧美日本综合一区二区三区 | 看看的在线视频国产 | 欧美色亚洲图 | 天天天干干干 | 色老头一区二区三区 | 国产区一区二区三 | 伊人久久精品亚洲精品一区 | 亚洲综合精品一二三区在线 | 毛片a级放荡的护士hd | 狠狠综合久久久久综合 | 久久黄色网 | 97成人在线视频 |