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

JDK 的 JNI 的經典使用

系統 1743 0

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

當一個程序無法完全使用Java編寫時,開發者可以通過JNI來編寫本地方法,比如標準Java類庫并不支持的依賴于平臺的特色或者程序庫。JNI還可以用于修改現有的使用其它語言編寫的程序,使它們可以通過Java編寫的程序來訪問。

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

JNI工作原理

在JNI中,本地函數是通過一個獨立的.c或.cpp文件來實現的(C 為JNI提供的界面會更簡潔一些)。當JVM調用該函數時,它傳遞了一個JNIEnv指針、一個jobject指針和通過Java方法定義的Java參數,JNI函數的形式如下:

JNIEXPORT void JNICALL Java_ClassName_MethodName

(JNIEnv *env, jobjectobj)

{

//Method native implemenation

}

env指針是一個包含了JVM接口的結構,它包含了與JVM進行交互以及與Java對象協同工作所必需的函數,示例中的JNI函數可以在本地數組和Java數組類型之間、本地字符串和Java字符串類型之間進行轉換,其功能還包括對象的實例化、拋出異常等。基本上您可以使用JNIEnv來實現所有Java能做到的事情,雖然要簡單很多。

更加正式的解釋是這樣的,本地代碼通過調用JNI的函數來訪問JVM,這是通過一個界面指針實現的(界面指針實際上是指向指針的指針),該指針指向一個指針數組,數組中的每個指針都指向了一個界面函數,而每個界面函數都是在數組中預先定義過的。

本地方法將JNI界面指針當作一個參數,如果在同一個Java線程中,出現對該本地方法的多重調用,JVM則保證傳遞相同的界面指針到本地方法。不過,一個本地方法可以被不同的Java線程調用,因而也可能會收到不同的JNI界面指針。

本地方法是通過System.loadLibrary方法加載的,在以下的例子中,類的初始化方法加載了一個指定平臺的本地類庫,該類庫定義了本地方法:

packagepkg;

class Cls {

native double f(inti, String s);

static {

System.loadLibrary(pkg_Cls");

}

}

System.loadLibrary方法的參數是一個類庫的名稱,它可以由程序員任意選取,系統則遵循一個標準的本地化平臺的方式來轉換類庫的名稱到一個本地類庫的名稱。例如,在Solaris操作系統中會將pkg_Cls轉換為libpkg_Cls.so,而Win32系統則會將同樣的pkg_Cls轉換為pkg_Cls.dll。

動態指針會根據它們的名字來進行解析,一個本地方法的名稱是按照組件進行連接的,它包含了:前綴“Java_”、一個分離的合法的類名稱和一個分離的方法名稱。

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

數據類型映射



基本類型,比如整型、字符等等,是在Java和本地代碼間進行拷貝的,而其他的自定義Java對象則是通過引用來傳遞的。



這個表格展示了Java和本地代碼之間的類型映射,這些類型是可以互換的,您可以在您使用int類型的位置使用jint類型,當然反過來也一樣,而且不需要任何類型轉化。但是,Java的字符串和數組類型和本地的字符串與數組類型之間的轉換就比較困難了,如果您使用的jstring類型中出現了字符“*”,您的代碼會造成JVM的崩潰,以下的例子說明了您應當如何正確使用字符串:

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對象。

總結

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

JDK 的 JNI 的經典使用


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: xxxx日本免费高清视频 | 天堂精品高清1区2区3区 | 国产美女视频免费 | 91精品国产一区二区三区左线 | 国产成人做受免费视频 | 成人凹凸短视频在线观看 | 伊人影院视频 | 在线观看视频91 | 亚洲欧美日韩综合 | 亚欧人成精品免费观看 | 国内精品一区二区2021在线 | 美女操穴 | 久久精品一区二区三区不卡牛牛 | 亚洲 欧美 国产另类首页 | 国产欧美视频在线观看 | 啪啪网站免费 | 精品国产第一国产综合精品 | 91精品国产91久久久久久 | 亚洲欧美一二三区 | 久久这里只有精品23 | 亚洲自拍成人 | 另类亚洲图片 | 欧美美妇性较大毛片 | 天天做天天做天天综合网 | 久久这里只有精品国产 | 亚洲欧美综合精品成 | 久草热线 | 中文精品久久久久国产不卡 | 免费高清一级欧美片在线观看 | 四虎永久免费地址在线观看 | 四虎黄色网 | 成人在线视频免费观看 | 欧美激情一区二区三区视频 | 狠狠色噜噜噜噜狠狠狠狠狠狠奇米 | 99爱这里只有精品 | 春色www在线视频观看 | 免费的性生活视频 | 91最新在线| 九九热精品免费视频 | 亚洲精品国产一区二区图片欧美 | 一区二区三区免费在线视频 |