最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Java 本地接口 JNI 使用方法

 更新時間:2017年09月07日 11:08:54   作者:攻城獅--晴明  
這篇文章主要介紹了詳解Java 本地接口 JNI 使用方法的相關(guān)資料,希望通過本文大家能徹底使用JNI編程,需要的朋友可以參考下

詳解Java 本地接口 JNI 使用方法

對于Java程序員來說,Java語言的好處和優(yōu)點,我想不用我說了,大家自然會說出很多一套套的。但雖然我們作為java程序員,但我們不得不承認java語言也有一些它本身的缺點。比如在性能、和底層打交道方面都有它的缺點。所以java就提供了一些本地接口,他主要的作用就是提供一個標準的方式讓java程序通過虛擬機與原生代碼進行交互,這也就是我們平常常說的java本地接口(JNI——java native Interface)。它使得在 Java 虛擬機 (VM) 內(nèi)部運行的 Java 代碼能夠與用其它編程語言(如 C、C++ 和匯編語言)編寫的應(yīng)用程序和庫進行互操作。JNI 最重要的好處是它沒有對底層 Java 虛擬機的實現(xiàn)施加任何限制。因此,Java虛擬機廠商可以在不影響虛擬機其它部分的情況下添加對 JNI 的支持。程序員只需編寫一種版本的本地應(yīng)用程序或庫,就能夠與所有支持 JNI 的 Java 虛擬機協(xié)同工作。我們來看一下為什么要與原生代碼進行交互:

一:提高應(yīng)用程序性能。我們知道java對于c/c++、匯編語言來說,顯得比較“高級”。其實這里的高級就是簡化了程序員的工作。很多底層的東西都讓java虛擬機做了。但畢竟相對于直接訪問底層來講,java多了一步虛擬機的過程,所以在性能上比著這些原生語言稍微有點慢。

二:實現(xiàn)一些與底層相關(guān)的功能。Java平臺提供的標準類庫,還有強大的API,雖然能完成大部分功能。但有些和底層硬件打交道的功能在java API提供的類庫中還是無法完成。

三:與已有的使用原生代碼編寫的程序進行集成。在于操作系統(tǒng)上由c或者c++等原生語言編寫的軟件進行集 0成的時候,可以用JNI。

JNI 接口函數(shù)和指針

     平臺相關(guān)代碼是通過調(diào)用 JNI 函數(shù)來訪問 Java 虛擬機功能的。JNI 函數(shù)可通過接口指針來獲得。接口指針是指針的指針,它指向一個指針數(shù)組,而指針數(shù)組中的每個元素又指向一個接口函數(shù)。每個接口函數(shù)都處在數(shù)組的某個預(yù)定偏移量中。下圖說明了接口指針的組織結(jié)構(gòu)。

                  

           JNI 接口的組織類似于 C++ 虛擬函數(shù)表或 COM 接口。使用接口表而不使用硬性編入的函數(shù)表的好處是使 JNI 名字空間與平臺相關(guān)代碼分開。虛擬機可以很容易地提供多個版本的 JNI 函數(shù)表。例如,虛擬機可支持以下兩個 JNI 函數(shù)表:

· 一個表對非法參數(shù)進行全面檢查,適用于調(diào)試程序;

· 另一個表只進行 JNI 規(guī)范所要求的最小程度的檢查,因此效率較高。

JNI 接口指針只在當前線程中有效。因此,本地方法不能將接口指針從一個線程傳遞到另一個線程中。實現(xiàn) JNI 的虛擬機可將本地線程的數(shù)據(jù)分配和儲存在 JNI 接口指針所指向的區(qū)域中。

本地方法將JNI 接口指針當作參數(shù)來接受。虛擬機在從相同的 Java 線程中對本地方法進行多次調(diào)用時,保證傳遞給該本地方法的接口指針是相同的。但是,一個本地方法可被不同的 Java 線程所調(diào)用,因此可以接受不同的 JNI 接口指針。                     

(1)編寫Java類代碼

    其中,需要JNI實現(xiàn)的方法應(yīng)當用native關(guān)鍵字聲明。在該類中,用System.1oadLibrary()方法加載需要的動態(tài)鏈接庫。關(guān)鍵代碼如下:  

 //Compute.java
 public class Compute{
 public native double sqrt(double params);
 static{
 //調(diào)用動態(tài)鏈接庫
 System.loadLibrary(“compute”);
 }

  (2)編譯成字節(jié)代碼

    在這個過程中,由于采用了native關(guān)鍵字聲明,Java編譯器會忽視沒有代碼體的JNI方法部分。   

 (3)生成相關(guān)JNI方法的頭文件

    這個過程的實現(xiàn)一般是通過利用jlavah-jni  * class生成的(-jni可以省略),也可以手工生成該文件;但是由于 Java 虛擬機是根據(jù)一定的命名規(guī)范完成對JNI方法的調(diào)用,所以手工編寫頭文件需要特別小心。

    上述文件產(chǎn)生的頭文件部分代碼如下: 

 //Compute.h
 extern“C”{
 JNIEXPORT jdoubleJNICALL Java_Compute_comp(JNI-Env *, jobject, jdoubleArray);

    JNI函數(shù)名稱分為三部分:首先是Java關(guān)鍵字,供Java虛擬機識別;然后是調(diào)用者類名稱(全限定的類名,其中用下劃線代替名稱分隔符);最后是對應(yīng)的方法名稱,各段名稱之間用下劃線分割。

    JNI函數(shù)的參數(shù)也由三部分組成:首先是JNIEnv *,是一個指向JNI運行環(huán)境的指針;第二個參數(shù)隨本地方法是靜態(tài)還是非靜態(tài)而有所不同一一非靜態(tài)本地方法的第二個參數(shù)是對對象的引用,而靜態(tài)本地方法的第二個參數(shù)是對其Java類的引用;其余的參數(shù)對應(yīng)通常Java方法的參數(shù),參數(shù)類型需要根據(jù)一定規(guī)則進行映射。

    (4)編寫相應(yīng)方法的實現(xiàn)代碼

    在編碼過程中,需要注意變量的長度問題,例如Java的整型變量長度為32位,而C語言為16位,所以要仔細核對變量類型映射表,防止在傳值過程中出現(xiàn)問題。

    (5)將JNI實現(xiàn)代碼編譯成動態(tài)鏈接庫

    編譯過程是利用C/C++編譯器實現(xiàn)的,在windows平臺上,編譯和連接的結(jié)果是動態(tài)鏈接庫DLL文件。當要使用生成的動態(tài)鏈接庫時,調(diào)用者類中需要顯式調(diào)用該鏈接庫dll文件。

    經(jīng)過上述處理,基本上完成了一個包含本地化方法的Java類的開發(fā)。

附錄:將Jav類型映射到本地 C 類型

 基本類型和本地等效類型

Java 類型

本地類型

說明

boolean

jboolean

無符號,8 位

byte

jbyte

無符號,8 位

char

jchar

無符號,16 位

short

jshort

有符號,16 位

int

jint

有符號,32 位

long

jlong

有符號,64 位

float

jfloat

32 位

double

jdouble

64 位

void

void

N/A

為了使用方便,特提供以下定義。

 #define JNI_FALSE 0
 #define JNI_TRUE 1

jsize 整數(shù)類型用于描述主要指數(shù)和大?。?br />

typedef jint jsize;

故障排除

當使用 JNI 從 Java 程序訪問本機代碼時,您會遇到許多問題。您會遇到的三個最常見的錯誤是:

1)無法找到動態(tài)鏈接。它所產(chǎn)生的錯誤消息是:java.lang.UnsatisfiedLinkError。這通常指無法找到共享庫,或者無法找到共享庫內(nèi)特定的本機方法。

2)無法找到共享庫文件。當用 System.loadLibrary(String libname) 方法(參數(shù)是文件名)裝入庫文件時,請確保文件名拼寫正確以及沒有指定擴展名。還有,確保庫文件的位置在類路徑中,從而確保 JVM 可以訪問該庫文件。

3)無法找到具有指定說明的方法。確保您的 C/C++ 函數(shù)實現(xiàn)擁有與頭文件中的函數(shù)說明相同的說明。

結(jié)束語

            從 Java 調(diào)用 C 或 C++ 本機代碼(雖然不簡單)是 Java 平臺中一種良好集成的功能。雖然 JNI 支持 C 和 C++,但 C++ 接口更清晰一些并且通常比 C 接口更可取。正如您已經(jīng)看到的,調(diào)用 C 或 C++ 本機代碼需要賦予函數(shù)特殊的名稱,并創(chuàng)建共享庫文件。當利用現(xiàn)有代碼庫時,更改代碼通常是不可取的。要避免這一點,在 C++ 中,通常創(chuàng)建代理代碼或代理類,它們有專門的 JNI 所需的命名函數(shù)。然后,這些函數(shù)可以調(diào)用底層庫函數(shù),這些庫函數(shù)的說明和實現(xiàn)保持不變。

如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • SpringBoot整合Guava Cache實現(xiàn)全局緩存的示例代碼

    SpringBoot整合Guava Cache實現(xiàn)全局緩存的示例代碼

    這篇文章主要介紹了SpringBoot整合Guava Cache實現(xiàn)全局緩存,Guava Cache是Google Guava庫中的一個模塊,提供了基于內(nèi)存的本地緩存實現(xiàn),文中介紹了SpringBoot整合使用Guava Cache的具體步驟,需要的朋友可以參考下
    2024-03-03
  • Java實現(xiàn)的剪刀石頭布游戲示例

    Java實現(xiàn)的剪刀石頭布游戲示例

    這篇文章主要介紹了Java實現(xiàn)的剪刀石頭布游戲,涉及java隨機數(shù)生成及邏輯判定等相關(guān)操作技巧,需要的朋友可以參考下
    2017-12-12
  • Mybatis查詢條件包含List的情況說明

    Mybatis查詢條件包含List的情況說明

    這篇文章主要介紹了Mybatis 查詢條件包含List的情況,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 自定義spring mvc的json視圖實現(xiàn)思路解析

    自定義spring mvc的json視圖實現(xiàn)思路解析

    這篇文章主要介紹了自定義spring mvc的json視圖的實現(xiàn)思路解析,本文給大家介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下
    2017-12-12
  • Spring?Cloud?Eureka基礎(chǔ)應(yīng)用及原理

    Spring?Cloud?Eureka基礎(chǔ)應(yīng)用及原理

    這篇文章主要介紹了Spring?Cloud?Eureka基礎(chǔ)應(yīng)用,Eureka?Client中內(nèi)置一個負載均衡器,用來進行基本的負載均衡,下面我們將通過搭建一個簡單的Eureka例子來了解Eureka的運作原理,感興趣的朋友一起看看吧
    2022-05-05
  • 詳解RSA加密算法的原理與Java實現(xiàn)

    詳解RSA加密算法的原理與Java實現(xiàn)

    這篇文章主要和大家分享非對稱加密中的一種算法,那就是 RSA 加密算法。本文介紹了RSA算法的原理與Java實現(xiàn),感興趣的小伙伴可以嘗試一下
    2022-10-10
  • java調(diào)用oracle分頁存儲過程示例

    java調(diào)用oracle分頁存儲過程示例

    這篇文章主要介紹了java調(diào)用oracle分頁存儲過程,需要的朋友可以參考下
    2014-03-03
  • springboot與springmvc基礎(chǔ)入門講解

    springboot與springmvc基礎(chǔ)入門講解

    本篇文章主要介紹了詳解快速搭建Spring Boot+Spring MVC,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-07-07
  • 通過簡易例子講解Java回調(diào)機制

    通過簡易例子講解Java回調(diào)機制

    這篇文章主要介紹了通過簡易例子講解Java回調(diào)機制,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • java基礎(chǔ)之反射和泛型以及注解

    java基礎(chǔ)之反射和泛型以及注解

    這篇文章主要介紹了 java基礎(chǔ)之反射和泛型以及注解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07

最新評論

江永县| 舞钢市| 高雄县| 嵩明县| 孟连| 沁源县| 襄城县| 盈江县| 大厂| 荔波县| 商都县| 南皮县| 栾川县| 海门市| 宁安市| 库伦旗| 南投市| 海丰县| 沂南县| 西丰县| 务川| 和平县| 正定县| 邹城市| 辽阳市| 云安县| 肥东县| 丰都县| 阿拉善盟| 灯塔市| 江北区| 元江| 海城市| 安丘市| 天水市| 宁阳县| 湘潭县| 井研县| 阳山县| 美姑县| 武隆县|