JNI/NDK开发指南(三)——JNI数据类型及与Java数据类型的映射关系
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
? ? ? ? 轉(zhuǎn)載請注明出處:http://blog.csdn.net/xyang81/article/details/42047899
? ? ? ?當(dāng)我們在調(diào)用一個Java native方法的時候,方法中的參數(shù)是如何傳遞給C/C++本地函數(shù)中的呢?Java方法中的參數(shù)與C/C++函數(shù)中的參數(shù),它們之間是怎么轉(zhuǎn)換的呢?我猜你應(yīng)該也有相關(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中相應(yīng)的數(shù)據(jù)類型,不難理解,在調(diào)用Java native方法將實參傳遞給C/C++函數(shù)的時候,會自動將java形參的數(shù)據(jù)類型自動轉(zhuǎn)換成C/C++相應(yīng)的數(shù)據(jù)類型,所以我們在寫JNI程序的時候,必須要明白它們之間數(shù)據(jù)類型的對應(yīng)關(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ù)類型分別對應(yīng)JNI數(shù)據(jù)類型中的jbyte、jchar、jshort、jint、jlong、jfloat、jdouble、jboolean。引用類型在JNI中全部由jobject表示,jobject有很多子類:jstring、jclass、jthrowable、jarray,其中jarray有8個子類,分別對應(yīng)Java中的8種基本數(shù)據(jù)類型(jintArray、jshortArray、jlongArray等),由于字符串在開發(fā)當(dāng)中經(jīng)常用到,所以Java中的String類型在JNI中用jstring表示。下面再回顧頭來看看test方法與Java_com_study_jnilearn_HelloWorld_test函數(shù)中參數(shù)類型的對應(yīng)關(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ù)都是一一對應(yīng)的。下面是JNI規(guī)范文檔中描述Java與JNI數(shù)據(jù)類型的對應(yīng)關(guān)系:
基本數(shù)據(jù)類型:
引用類型:
注意:
1、JNI如果使用C++語言編寫的話,所有引用類型派生自jobject,使用C++的繼承結(jié)構(gòu)特性,使用相應(yīng)的類型。如下所示:
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編程當(dāng)中的應(yīng)用。原型如下:
typedef?union?jvalue?{jboolean?z;jbyte????b;jchar????c;jshort???s;jint?????i;jlong????j;jfloat???f;jdouble??d;jobject??l; }?jvalue;如果對unio類型不太明白的同學(xué),請參考相關(guān)資料,在這里不細(xì)講。
轉(zhuǎn)載于:https://my.oschina.net/xyang0917/blog/358802
總結(jié)
以上是生活随笔為你收集整理的JNI/NDK开发指南(三)——JNI数据类型及与Java数据类型的映射关系的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【分块答案】【最小割】bzoj1532
- 下一篇: openfire安装配置完全教程