本篇文章為大家展示了如何通過JNI本地編寫來解決Java無法編寫大問題,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
公司主營(yíng)業(yè)務(wù):做網(wǎng)站、網(wǎng)站設(shè)計(jì)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出馬鞍山免費(fèi)做網(wǎng)站回饋大家。
在您的程序中使用JNI并不是一件容易的事情,然而,JNI的性能和使用原有代碼的能力將會(huì)為您的Java程序添加更多的功能并且能勝任更多的挑戰(zhàn)。
Java本地接口(JNI——Java Native Interface)允許運(yùn)行在Java虛擬機(jī)(JVM——Java Virtual Machine)上的代碼調(diào)用本地程序和類庫,或者被它們調(diào)用,這些程序和類庫可以是其它語言編寫的,比如C、C++或者匯編語言。當(dāng)一個(gè)程序無法完全使用Java編寫時(shí),開發(fā)者可以通過JNI來編寫本地方法,比如標(biāo)準(zhǔn)Java類庫并不支持的依賴于平臺(tái)的特色或者程序庫。JNI還可以用于修改現(xiàn)有的使用其它語言編寫的程序,使它們可以通過Java編寫的程序來訪問。很多基本類庫都依賴JNI來為開發(fā)者和用戶提供服務(wù),比如文件的輸入/輸出和音頻功能。在基本類庫中包含的對(duì)于性能和平臺(tái)敏感的API可以允許所有的Java程序以安全和平臺(tái)無關(guān)的方式來使用這些功能,在采用JNI之前,開發(fā)者需要明確這些功能并不是已經(jīng)包含在Java標(biāo)準(zhǔn)類庫中的,在這篇文章中,我將會(huì)講解JNI是如何工作的以及本地類型是如何映射到Java的類型和類庫的。
JNI工作原理
在JNI中,本地函數(shù)是通過一個(gè)獨(dú)立的.c或.cpp文件來實(shí)現(xiàn)的(C++為JNI提供的界面會(huì)更簡(jiǎn)潔一些)。當(dāng)JVM調(diào)用該函數(shù)時(shí),它傳遞了一個(gè)JNIEnv指針、一個(gè)jobject指針和通過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í)例化、拋出異常等?;旧夏梢允褂肑NIEnv來實(shí)現(xiàn)所有Java能做到的事情,雖然要簡(jiǎn)單很多。更加正式的解釋是這樣的,本地代碼通過調(diào)用JNI的函數(shù)來訪問JVM,這是通過一個(gè)界面指針實(shí)現(xiàn)的(界面指針實(shí)際上是指向指針的指針),該指針指向一個(gè)指針數(shù)組,數(shù)組中的每個(gè)指針都指向了一個(gè)界面函數(shù),而每個(gè)界面函數(shù)都是在數(shù)組中預(yù)先定義過的。本地方法將JNI界面指針當(dāng)作一個(gè)參數(shù),如果在同一個(gè)Java線程中,出現(xiàn)對(duì)該本地方法的多重調(diào)用,JVM則保證傳遞相同的界面指針到本地方法。不過,一個(gè)本地方法可以被不同的Java線程調(diào)用,因而也可能會(huì)收到不同的JNI界面指針。
本地方法是通過System.loadLibrary方法加載的,在以下的例子中,類的初始化方法加載了一個(gè)指定平臺(tái)的本地類庫,該類庫定義了本地方法:
packagepkg; class Cls { native double f(inti, String s); static { System.loadLibrary(pkg_Cls"); } }
System.loadLibrary方法的參數(shù)是一個(gè)類庫的名稱,它可以由程序員任意選取,系統(tǒng)則遵循一個(gè)標(biāo)準(zhǔn)的本地化平臺(tái)的方式來轉(zhuǎn)換類庫的名稱到一個(gè)本地類庫的名稱。例如,在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ù)它們的名字來進(jìn)行解析,一個(gè)本地方法的名稱是按照組件進(jìn)行連接的,它包含了:前綴“Java_”、一個(gè)分離的合法的類名稱和一個(gè)分離的方法名稱。注意:微軟的JVM有相同的機(jī)制從Java調(diào)用本地Windows代碼,該機(jī)制被稱為原始本地接口(Raw Native Interface (RNI))?;绢愋?,比如整型、字符等等,是在Java和本地代碼間進(jìn)行拷貝的,而其他的自定義Java對(duì)象則是通過引用來傳遞的。這個(gè)表格展示了Java和本地代碼之間的類型映射,這些類型是可以互換的,您可以在您使用int類型的位置使用jint類型,當(dāng)然反過來也一樣,而且不需要任何類型轉(zhuǎn)化。但是,Java的字符串和數(shù)組類型和本地的字符串與數(shù)組類型之間的轉(zhuǎn)換就比較困難了,如果您使用的jstring類型中出現(xiàn)了字符“*”,您的代碼會(huì)造成JVM的崩潰,以下的例子說明了您應(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來操作Java對(duì)象。
上述內(nèi)容就是如何通過JNI本地編寫來解決Java無法編寫大問題,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
文章題目:如何通過JNI本地編寫來解決Java無法編寫大問題
地址分享:http://m.kartarina.com/article12/jecegc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營(yíng)銷、電子商務(wù)、虛擬主機(jī)、用戶體驗(yàn)、網(wǎng)站設(shè)計(jì)公司、關(guān)鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)