中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JNI語言基本知識

發布時間:2020-10-08 11:04:19 來源:腳本之家 閱讀:179 作者:動力節點 欄目:編程語言

JNI簡介

JNI是Java Native Interface的縮寫,它提供了若干的API實現了Java和其他語言的通信(主要是C&C++)。從Java1.1開始,JNI標準成為java平臺的一部分,它允許Java代碼和其他語言寫的代碼進行交互。JNI一開始是為了本地已編譯語言,尤其是C和C++而設計的,但是它并不妨礙你使用其他編程語言,只要調用約定受支持就可以了。使用java與本地已編譯的代碼交互,通常會喪失平臺可移植性。但是,有些情況下這樣做是可以接受的,甚至是必須的。例如,使用一些舊的庫,與硬件、操作系統進行交互,或者為了提高程序的性能。JNI標準至少要保證本地代碼能工作在任何Java 虛擬機環境。

一、本地方法的參數

如何本地方法聲明為static,那么生成的頭文件中的本地方法形式如下:

JNIEXPORT void JNICALL Java_com_tao_test_NativeTest_sayHello (JNIEnv * , jclass);

這兩個參數的意思是什么:JNIEnv類型實際上代表了Java環境。通過這個JNIEnv*指針,就可以對Java端的代碼進行操作。例如,創建Java類的對象,調用Java對象的方法,獲取Java對象的屬性等等。JNIEnv的指針會被JNI傳入到本地方法的實現函數中來對Java端的代碼進行操作。而jclass,則代表調用這個靜態方法類的Class對象,即該Class類的字節碼。

如何本地方法沒有聲明為static,那么生成的頭文件中的本地方法形式如下:

JNIEXPORT void JNICALL Java_com_tao_test_NativeTest_sayHello (JNIEnv * , jobject);

jobject類型相當于java中的Object類型,它代表調用這個本地方法的對象,實際上準確的說,,保持了一個對  調用這個方法的的對象的引用。比如說,如果是new NativeTest().sayHello()調用這個方法,那么這個引用指向了這個new NativeTest()對象。

JNIEnv類中有許多函數可以用:

NewObject   創建一個對象

NewString  創建一個String對象

New<TYPE>Array  創建某個類型的數組

Get/Set<TYPE>Field   獲取或設置某個成員變量的屬性 

Get/SetStatic<TYPE>Field  獲取或設置某個成靜態員變量的屬性

Call<TYPE>Method/CallStatic<TYPE>Method   調用某個java對象的方法/或靜態方法

等等許多函數

二、數值參數

用Java代碼調用C\C++代碼時候,肯定會有數值的傳遞。兩者屬于不同的編程語言,在數據類型上有很多差別,應該要知道他們彼此之間的對應類型。例如,盡管C擁有int和long的數據類型,但是他們的實現卻是取決于平臺的。在一些平臺上,int類型是16位的,而在另外一些平臺上市32位的整數。基于這個原因,Java本地接口定義了jint,jlong等等。

Java類型和C/C++數據類型的對應關系,可以看到,這些新定義的類型名稱和Java類型名稱具有一致性,只是在前面加了個j,如int對應jint,long對應jlong。

我們看看jni.h和jni_md.h頭文件,可以更直觀的了解:

typedef unsigned char  jboolean; 
typedef unsigned short jchar; 
typedef short      jshort; 
typedef float      jfloat; 
typedef double     jdouble; 
typedef long jint; 
typedef __int64 jlong; 
typedef signed char jbyte; 

可以看到,例如jint代表的是和Java類型int一樣的類型,但是并不是C/C++中int。從定義可以看到,Java中的int,也就是jni中的jint,對應的是C/C++中的long類型。

所以如果要在本地方法中要定義一個jint類型的數據,規范的寫法應該是 jint i=10L;

在 比如jchar代表的是Java類型的char類型,實際上在C/C++中卻是unsigned short類型 ,而在C/C++中有這樣的定義:typedef unsigned short wchar_t。所以jchar就是相當于C/C++中的寬字符,也就是說java中的char  相當于C/C++中的寬字符。所以如果要在本地方法中要定義一個jchar類型的數據,規范的寫法應該是jchar c=L'C';

實際上,所以帶j的類型,都是代表Java中的類型,它與C/C++中的類型是不一樣的,所以在內部都要轉換,我們在使用的時候也需要小心。可以看后面關于JNI中對字符串的操作。

三。Java對象在C\C++代碼中的形式

查看jni.h頭文件,可以看到下面的內容

class _jclass : public _jobject {}; 
class _jthrowable : public _jobject {}; 
class _jstring : public _jobject {}; 
class _jarray : public _jobject {}; 
class _jbooleanArray : public _jarray {}; 
class _jbyteArray : public _jarray {}; 
class _jcharArray : public _jarray {}; 
class _jshortArray : public _jarray {}; 
class _jintArray : public _jarray {}; 
class _jlongArray : public _jarray {}; 
class _jfloatArray : public _jarray {}; 
class _jdoubleArray : public _jarray {}; 
class _jobjectArray : public _jarray {}; 

其實這些加了_j首字母的類,都是集成于_jobject,這也是為了照顧我們java中的,Object類是一切類的基類。

這些類,對應的就是java中的類,只不過,在C/C++中換了中形式而已。

四、jclass類和如何取得jclass對象

在Java中,Class類型代表一個類編譯的字節碼,即這個類,里面包含了這個類的所有信息。在JNI中,同樣定義了這樣一個類,那就是jclass。了解反射的人都知道Class類是如何重要,可以通過反射獲得java類的信息和訪問里面的方法和成員變量。所以在JNI中,也有這樣一個jclass類,來代表Class類。
JNIEnv有幾個方法可以取得jclass對象:

jclass FindClass(const char *name) {
    return functions->FindClass(this, name);
 }

FindClass會在系統classpath下尋找類,傳入完整的類型,注意包的間隔使用   / ,而不是.   比如:

jclass cls_string=env->FindClass("java/lang/String");
jclass GetObjectClass(jobject obj) {
    return functions->GetObjectClass(this,obj);
  }
jclass GetSuperclass(jclass sub) {
    return functions->GetSuperclass(this, sub);
  }

得到java類的Class對象,即jclass,那么就可以用和反射差不多的形式,來得到java類中的成員變量和方法等等,雖然方式和Class不一樣,不過大抵的形式相當。

總結

以上所述是小編給大家介紹的JNI語言基本知識,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

和平县| 霍州市| 含山县| 湛江市| 凌云县| 元氏县| 钟祥市| 扎兰屯市| 博湖县| 从化市| 乌拉特前旗| 弥渡县| 大连市| 奉新县| 化州市| 湘潭市| 广东省| 阳江市| 深水埗区| 敦化市| 潮安县| 茂名市| 蓬莱市| 资溪县| 灵石县| 耿马| 左贡县| 钟山县| 土默特右旗| 德清县| 子洲县| 景德镇市| 前郭尔| 康马县| 扶沟县| 大同市| 通海县| 昌图县| 荔浦县| 清涧县| 新河县|