JNI/NDK开发指南(三)——JNI数据类型及与Java数据类型的映射关系
2019獨角獸企業重金招聘Python工程師標準>>>
? ? ? ? 轉載請注明出處:http://blog.csdn.net/xyang81/article/details/42047899
? ? ? ?當我們在調用一個Java native方法的時候,方法中的參數是如何傳遞給C/C++本地函數中的呢?Java方法中的參數與C/C++函數中的參數,它們之間是怎么轉換的呢?我猜你應該也有相關的疑慮吧,咱們先來看一個例子,還是以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個參數,其中前面8個為基本數據類型,后面4個全部為引用類型。
HelloWorld.class生成的頭文件內容:
/**?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);
從頭文件函數的原型可以得知,test方法中形參的數據類型自動轉換成了JNI中相應的數據類型,不難理解,在調用Java native方法將實參傳遞給C/C++函數的時候,會自動將java形參的數據類型自動轉換成C/C++相應的數據類型,所以我們在寫JNI程序的時候,必須要明白它們之間數據類型的對應關系。
? ? ? ??在Java語言中數據類型分為基本數據類型和引用類型,其中基本數據類型有8種:byte、char、short、int、long、float、double、boolean,除了基本數據類型外其它都是引用類型:Object、String、數組等。8種基本數據類型分別對應JNI數據類型中的jbyte、jchar、jshort、jint、jlong、jfloat、jdouble、jboolean。引用類型在JNI中全部由jobject表示,jobject有很多子類:jstring、jclass、jthrowable、jarray,其中jarray有8個子類,分別對應Java中的8種基本數據類型(jintArray、jshortArray、jlongArray等),由于字符串在開發當中經常用到,所以Java中的String類型在JNI中用jstring表示。下面再回顧頭來看看test方法與Java_com_study_jnilearn_HelloWorld_test函數中參數類型的對應關系:
//?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);
從上面兩個函數的參數中可以看出來,除了JNIEnv和jclass這兩個參數外,其它參數都是一一對應的。下面是JNI規范文檔中描述Java與JNI數據類型的對應關系:
基本數據類型:
引用類型:
注意:
1、JNI如果使用C++語言編寫的話,所有引用類型派生自jobject,使用C++的繼承結構特性,使用相應的類型。如下所示:
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(聯合)類型,在C語中為了節約內存,會用聯合類型變量來存儲聲明在聯合體中的任意類型數據 。在JNI中將基本數據類型與引用類型定義在一個聯合類型中,表示用jvalue定義的變量,可以存儲任意JNI類型的數據,后面會介紹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類型不太明白的同學,請參考相關資料,在這里不細講。
轉載于:https://my.oschina.net/xyang0917/blog/358802
總結
以上是生活随笔為你收集整理的JNI/NDK开发指南(三)——JNI数据类型及与Java数据类型的映射关系的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【分块答案】【最小割】bzoj1532
- 下一篇: openfire安装配置完全教程