日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

JNI/NDK开发指南(三)——JNI数据类型及与Java数据类型的映射关系

發(fā)布時間:2025/7/14 65 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JNI/NDK开发指南(三)——JNI数据类型及与Java数据类型的映射关系 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2019獨角獸企業(yè)重金招聘Python工程師標準>>>


? ? ? ? 轉(zhuǎn)載請注明出處:http://blog.csdn.net/xyang81/article/details/42047899


? ? ? ?當我們在調(diào)用一個Java native方法的時候,方法中的參數(shù)是如何傳遞給C/C++本地函數(shù)中的呢?Java方法中的參數(shù)與C/C++函數(shù)中的參數(shù),它們之間是怎么轉(zhuǎn)換的呢?我猜你應該也有相關(guān)的疑慮吧,咱們先來看一個例子,還是以HelloWorld為例:

HelloWorld.java:

package?com.study.jnilearn;class?MyClass?{}public?class?HelloWorld?{public?static?native?void?test(short?s,?int?i,?long?l,?float?f,?double?d,?char?c,?boolean?z,?byte?b,?String?str,?Object?obj,?MyClass?p,?int[]?arr);public?static?void?main(String[]?args)?{String?obj?=?"obj";short?s?=?1;long?l?=?20;byte?b?=?127;test(s,?1,?l,?1.0f,?10.5,?'A',?true,?b,?"test",?obj,?new?MyClass(),?new?int[]?{});}static?{System.loadLibrary("HelloWorld");} }

在HelloWorld.java中定義了一個test的native方法,該方法中一個共有12個參數(shù),其中前面8個為基本數(shù)據(jù)類型,后面4個全部為引用類型。


HelloWorld.class生成的頭文件內(nèi)容:

/**?Class:?????com_study_jnilearn_HelloWorld*?Method:????test*?Signature:?(SIJFDCZBLjava/lang/String;Ljava/lang/Object;)V*/ JNIEXPORT?void?JNICALL?Java_com_study_jnilearn_HelloWorld_test(JNIEnv?*,?jclass,?jshort,?jint,?jlong,?jfloat,?jdouble,?jchar,?jboolean,?jbyte,?jstring,?jobject,?jobject);

從頭文件函數(shù)的原型可以得知,test方法中形參的數(shù)據(jù)類型自動轉(zhuǎn)換成了JNI中相應的數(shù)據(jù)類型,不難理解,在調(diào)用Java native方法將實參傳遞給C/C++函數(shù)的時候,會自動將java形參的數(shù)據(jù)類型自動轉(zhuǎn)換成C/C++相應的數(shù)據(jù)類型,所以我們在寫JNI程序的時候,必須要明白它們之間數(shù)據(jù)類型的對應關(guān)系。

? ? ? ??在Java語言中數(shù)據(jù)類型分為基本數(shù)據(jù)類型和引用類型,其中基本數(shù)據(jù)類型有8種:byte、char、short、int、long、float、double、boolean,除了基本數(shù)據(jù)類型外其它都是引用類型:Object、String、數(shù)組等。8種基本數(shù)據(jù)類型分別對應JNI數(shù)據(jù)類型中的jbyte、jchar、jshort、jint、jlong、jfloat、jdouble、jboolean。引用類型在JNI中全部由jobject表示,jobject有很多子類:jstring、jclass、jthrowable、jarray,其中jarray有8個子類,分別對應Java中的8種基本數(shù)據(jù)類型(jintArray、jshortArray、jlongArray等),由于字符串在開發(fā)當中經(jīng)常用到,所以Java中的String類型在JNI中用jstring表示。下面再回顧頭來看看test方法與Java_com_study_jnilearn_HelloWorld_test函數(shù)中參數(shù)類型的對應關(guān)系:

//?HelloWorld.java public?static?native?void?test(short?s,?int?i,?long?l,?float?f,?double?d,?char?c,?boolean?z,?byte?b,?String?str,?Object?obj,?MyClass?p);//?HelloWorld.h JNIEXPORT?void?JNICALL?Java_com_study_jnilearn_HelloWorld_test(JNIEnv?*,?jclass,?jshort,?jint,?jlong,?jfloat,?jdouble,?jchar,?jboolean,?jbyte,?jstring,?jobject,?jobject,?jintArray);

從上面兩個函數(shù)的參數(shù)中可以看出來,除了JNIEnv和jclass這兩個參數(shù)外,其它參數(shù)都是一一對應的。下面是JNI規(guī)范文檔中描述Java與JNI數(shù)據(jù)類型的對應關(guān)系:

基本數(shù)據(jù)類型:



引用類型:


注意:

1、JNI如果使用C++語言編寫的話,所有引用類型派生自jobject,使用C++的繼承結(jié)構(gòu)特性,使用相應的類型。如下所示:

class?_jobject?{};class?_jclass?:?public?_jobject?{};class?_jstring?:?public?_jobject?{};class?_jarray?:?public?_jobject?{};class?_jbooleanArray?:?public?_jarray?{};class?_jbyteArray?:?public?_jarray?{};...

2、JNI如果使用C語言編寫的話,所有引用類型使用jobject,其它引用類型使用typedef重新定義,如:typedef jobject jstring


jvalue類型:

jvalue是一個unio(聯(lián)合)類型,在C語中為了節(jié)約內(nèi)存,會用聯(lián)合類型變量來存儲聲明在聯(lián)合體中的任意類型數(shù)據(jù) 。在JNI中將基本數(shù)據(jù)類型與引用類型定義在一個聯(lián)合類型中,表示用jvalue定義的變量,可以存儲任意JNI類型的數(shù)據(jù),后面會介紹jvalue在JNI編程當中的應用。原型如下:

typedef?union?jvalue?{jboolean?z;jbyte????b;jchar????c;jshort???s;jint?????i;jlong????j;jfloat???f;jdouble??d;jobject??l; }?jvalue;

如果對unio類型不太明白的同學,請參考相關(guān)資料,在這里不細講。



轉(zhuǎn)載于:https://my.oschina.net/xyang0917/blog/358802

總結(jié)

以上是生活随笔為你收集整理的JNI/NDK开发指南(三)——JNI数据类型及与Java数据类型的映射关系的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。