激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - JNI語言基本知識

JNI語言基本知識

2021-01-21 13:17動力節點 Java教程

JNI是Java Native Interface的縮寫,它提供了若干的API實現了Java和其他語言的通信(主要是C&C++)。接下來通過本文給大家分享jni 基礎知識,感興趣的朋友一起看看吧

JNI簡介

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

一、本地方法的參數

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

?
1
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,那么生成的頭文件中的本地方法形式如下:

?
1
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頭文件,可以更直觀的了解:

?
1
2
3
4
5
6
7
8
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頭文件,可以看到下面的內容

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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對象:

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

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

?
1
2
3
4
5
6
7
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語言基本知識,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 麻豆自拍偷拍视频 | 91专区在线观看 | 亚洲成人在线视频网 | 久久久成人精品 | 欧美视频国产精品 | 毛片视频在线免费观看 | 夜夜夜精品视频 | 精品人人人人 | 中文字幕在线播放不卡 | 国产免费成人 | 毛片网站视频 | 国产91在线高潮白浆在线观看 | 亚洲一级片在线观看 | 中文字幕在线资源 | 免费国产精品视频 | 黄色羞羞| 成人在线观看免费 | 亚洲成人免费网站 | 久久久一区二区三区精品 | 国产亚洲精品综合一区91555 | 一级一级一级一级毛片 | 一级毛片免费大片 | 久久久一区二区三区精品 | 久久久久免费精品国产小说色大师 | 国产亚洲精品久久久闺蜜 | 午夜久| 99re66热这里只有精品8 | 欧美成人鲁丝片在线观看 | 黄色免费影片 | 久久久三级免费电影 | 精品国产一区二区三区在线 | 国产婷婷一区二区三区 | 免费在线观看午夜视频 | 一本色道精品久久一区二区三区 | 极品一级片 | 国产一国产精品一级毛片 | 九九热久久免费视频 | 欧美三级美国一级 | 亚洲小视频在线播放 | 国产精品自拍片 | 国产噜噜噜|