資源描述:
《jni返回結(jié)構(gòu)體參數(shù)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在學(xué)術(shù)論文-天天文庫。
1、JNI返回結(jié)構(gòu)體參數(shù)如何使用JNI的一些基本方法和過程在網(wǎng)上多如牛毛,如果你對Jni不其了解,不知道Jni是做什么的,如何建立一個(gè)基本的jni程序,或許可以參考下面下面這些文章:利用VC++6.0實(shí)現(xiàn)JNI的鉍簡單的例了JNI入門教程之HelloWorld篇SUNJNITutorial這些資料的例子屮,大多數(shù)只是輸入一些簡單的參數(shù),獲取沒有參數(shù)。而在實(shí)際的使用過程屮,往往耑要對參數(shù)進(jìn)行處理轉(zhuǎn)換?才可以被C/C++程序識(shí)別?比如我們在C++屮有一個(gè)結(jié)構(gòu)(Struct)Disklnfo,需要傳遞一個(gè)類似于Disklnfo
2、*pDisklnfo的參數(shù),類似于在C++這樣參數(shù)如何傳遞到Java中呢?下面我們就來討論C++到Java屮方法的一些常見參數(shù)的轉(zhuǎn)換:定義NativeJava類:如果你4慣了使用JNI,你就不會(huì)覺得它難了。既然本地方法足由其他語言實(shí)現(xiàn)的,它們在Java屮沒有函數(shù)體。但是,所有本地代碼必須用本地關(guān)鍵詞聲明,成為Java類的成員。假設(shè)我們在C++中有這么一個(gè)結(jié)構(gòu),它用來描述硬盤信息:〕ava代碼1.//硬盤信息2.struct{3.charname[256];4.intserial;5.}DiskInfo;那么我們需要在
3、Java中定義一個(gè)類來與之匹配,聲明可以寫成這樣:]ava代碼1.classDisklnfo{2.//名字3.publicStringname;4.5.//序列號(hào)6.publicintserial;7.}在這個(gè)類中,申明一些Native的本地方法,來測試方法參數(shù)的傳遞,分別定義了一些函數(shù),用來傳遞結(jié)構(gòu)或者結(jié)構(gòu)數(shù)組,具體定義如下而代碼:Java代碼1.2.3.4.『本本//本木*氺*本本木**本木木氺本本*氺vi氺木**木氺*本*氺*本木氺**本本*氺///輸入常川的數(shù)值類型(Boolean,Byte,Char,Sho
4、rt,Int,Float,Double)publicnativevoiddisplayParms(StringshowText,inti,booleanbl);5.//調(diào)用一個(gè)靜態(tài)方法6.publicnativeintadd(inta,intb);7.7.//輸入一個(gè)數(shù)組8.publicnativevoidsetArray(boolean[]blList);10.9.//返回一個(gè)字符串?dāng)?shù)組10.publicnativeString[]getStringArray();13.11.//返回一個(gè)結(jié)構(gòu)12.publicna
5、tiveDisklnfogetStruct();16.13.//返冋一個(gè)結(jié)構(gòu)數(shù)組14.publicnativeDisklnfo[]getStructArray();編譯生成C/C++頭文件定義好了Java類之后,接下來就耍寫本地代碼。本地方法符號(hào)提供一個(gè)滿足約定的頭文件,使用Java工具Javah可以很界易地創(chuàng)建它而不用手動(dòng)去創(chuàng)建。你對Java的class文件使用javah命令,就會(huì)為你生成一個(gè)對應(yīng)的C/C++頭文件。1、在控制臺(tái)下進(jìn)入工作路徑,本工程路徑力:E:workjavaworkspaceJavaJn
6、i。2、運(yùn)行javah命令:javah-classpathE:workjavaworkspaceJavaJnicom.sundy.jnidemoChangeMethodFromJni本文生成的C/C++尖義件名為:com_sundyJnidemo_ChangeMethodFromJni.h在C/C++中實(shí)現(xiàn)本地方法生成C/C++頭文件之后,你就需耍寫頭文件對應(yīng)的本地方法。注意:所有的本地方法的第一個(gè)參數(shù)都是指向JN舊nv結(jié)構(gòu)的。這個(gè)結(jié)構(gòu)是用來調(diào)用JNI函數(shù)的。第二個(gè)參數(shù)jclass的意義,要看方法是不足靜態(tài)的
7、(static)或者實(shí)例(Instance)的。前者,jclass代表一個(gè)類對象的引用,而后者足被調(diào)用的方法所屬對象的引用。返M值和參數(shù)類型根裾等價(jià)約定映射到本地C/C++類型,如表JNI類型映射所示。有些類型,在本地代碼中可直接使用,而艽他類型只有通過JNI調(diào)用操作。表AJava類型木地類型描述booleanjbooleanC/C++8位整型bytejbyteC/C++帶符號(hào)的8位整型charjcharC/C++無符號(hào)的16位整型shortjshortC/C++帶符兮的16位整型intjintC/C++帶符號(hào)的32
8、位整型longjlongC/C++帶符號(hào)的64位整型efloatjfloatC/C++32位浮點(diǎn)型doublejdoubleC/C++64位浮點(diǎn)型Objectjobject任何Java對象,或者沒有對應(yīng)java類型的對象ClassjclassClass對象Stringjstring字符串對象Object[]jobjectArray任何對象的數(shù)組