jni工作機(jī)制簡介_第1頁
jni工作機(jī)制簡介_第2頁
jni工作機(jī)制簡介_第3頁
jni工作機(jī)制簡介_第4頁
jni工作機(jī)制簡介_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、安卓java層和linux底層程序相互調(diào)用,安卓和linux底層程序相互調(diào)用,安卓如何調(diào)用底層程序java程序訪問windows和linux底層c /c程序?JNI-java本地接口JNI標(biāo)準(zhǔn)是java平臺的一部分,它允許Java代碼與用其他語言編寫的代碼進(jìn)行交互。JNI是一個本地編程接口,它使運行在Java虛擬機(jī)中的Java代碼能夠與用其他編程語言(如C、C和匯編語言)編寫的應(yīng)用程序和庫進(jìn)行互操作。JNI工作機(jī)制,Java,VM,linux組件(C,C),JAVA類在編譯成Dex類型的字節(jié)碼后必須由Dalvik虛擬機(jī)執(zhí)行,JNI開發(fā)環(huán)境-ndk(推薦),Android提供了JNI開發(fā)環(huán)境下的

2、windows和Linux。ndk-Native Development Kit交叉編譯器編譯的代碼符合arm-linux,提供了用于編譯的Android基本sdk庫,并提供了bash模式的編譯命令。在linux下使用一個非常簡單的ndk配置,直接在linux下下載并解壓ndk開發(fā)包,ndk是一個在linux下運行的程序,需要在windows上模擬一個Linux環(huán)境來執(zhí)行Ndk。如何模擬?Cygwin windows配置ndk步驟:1。下載視窗版本ndk,2。安裝cygwin,稱為ndk環(huán)境。3.每次寫完程序代碼后啟動cygwin,然后執(zhí)行ndk編譯命令編譯和JNI開發(fā)步驟。1.用標(biāo)準(zhǔn)的C或C

3、語言編寫程序。2.與makefile中的linux類似,安卓jni編譯需要。mk文件編譯:使用命令ndk-bulid。例子:1 .我們選擇了ndk附帶的hello-jni示例,我的示例位于E3360安卓-NDK-R5示例hello-JNI(取決于您的具體安裝位置)。2.運行cygwin。輸入命令CD/cygdrive/e/Android-NDK-r5/samples/hello-JNI進(jìn)入e : Android-NDK-r5 samples hello-JNI目錄。3.輸入$NDK/ndk-build。成功執(zhí)行后,它將自動生成一個libs目錄,并將。所以文件是在里面編譯生成的。($NDK是調(diào)用

4、我們之前配置的環(huán)境變量,NDK-build是調(diào)用ndk的編譯器。)4 .此時,轉(zhuǎn)到hello-jni的libs目錄,看看是否有任何生成的。所以歸檔。例如,我們首先用java編寫helloworld應(yīng)用程序(APK)。這段代碼非常簡單,可以創(chuàng)建一個hello world活動公共類hello world擴(kuò)展活動私有靜態(tài)最終字符串標(biāo)記=hello world靜態(tài)系統(tǒng).加載庫(hello world);私有本機(jī)字符串PrintJni();/*首次創(chuàng)建活動時調(diào)用。*/覆蓋公共無效創(chuàng)建(捆綁保存標(biāo)準(zhǔn)屬性)超級.創(chuàng)建(保存標(biāo)準(zhǔn)屬性);設(shè)置內(nèi)容視圖(r . layout . main);日志d(標(biāo)簽,活動調(diào)用

5、JNI:打印JNI();c語言實現(xiàn)了helloworld共享庫,而javah工具可以用來根據(jù)java源程序生成頭文件javah com.simon.HelloWorld的本機(jī)代碼。注意:該命令必須在bin/class下執(zhí)行,并且頭文件com_simon_Helloworld.h,包括C/C聲明的printJNI接口,創(chuàng)建com_simon_Helloworld.c文件,包含# define log _ tag Hello World # include/*本機(jī)接口,它將以java代碼*/JNIEXPORT jstring調(diào)用Java _ com _ Simon _ Hello World _

6、printJNI(JNIEnv * env,job object obj)LOGI(Hello World From libhello World . so!);返回(* env)-新聞字符串。);/*首次加載庫時將調(diào)用此函數(shù)。*你可以在圖書館做一些初始化工作。返回它支持的jni版本。*/jint JNI_OnLoad(JavaVM* vm,void * reserved)void * venv;LOGI(JNI_OnLoad!);如果(* . VM)-GetEnv(VM,(void*),寫Android.mk,LOCAL_PATH:=$(調(diào)用my-dir)INCLUDE $(CLEAR _

7、VARS)LOCAL _ SRC _ FILES :=com _ Simon _ Hello world . C LOCAL _ C _ INCLUDES :=$(JNI _ H _ INCLUDE)Local _ module :=libhello world LOCAL _ shared _ libutils LOCAL _ prelink _ module :=INCLUDE $()1.描述包含的頭文件,它需要包含JNI頭文件。2.LOCAL_MODULE當(dāng)前模塊3的名稱。當(dāng)前的LOCAL_SHARED_LIBRARIES模塊需要依賴共享庫。因為我們調(diào)用安卓打印系統(tǒng)來輸出到日志,所以我們

8、必須依賴libutils庫。4、本地_預(yù)鏈接_模塊指明該模塊是否被啟動就加載,我們的helloworld庫不需要預(yù)鏈接,所以置為假的。JNI空氣污染指數(shù)為了避免丑陋的函數(shù)名,提供了方法向爪哇島虛擬機(jī)注冊函數(shù)映射表。這樣當(dāng)爪哇島調(diào)用當(dāng)?shù)氐慕涌诘臅r候,Java虛擬機(jī)就可以不用根據(jù)函數(shù)名來決定調(diào)用哪個函數(shù)了,直接通過查詢表格就可以找到需要調(diào)用的函數(shù)了,/*首次加載庫時將調(diào)用此函數(shù)*/jint JNI_OnLoad(JavaVM* vm,void * reserved)union jnievtvovovovoid uenv;*環(huán)境=空;LOGI(JNI_OnLoad!);if(VM-GetEnv)(v

9、oid * *),/* *為我們知道的所有類注冊本機(jī)方法* *成功時返回JNI真*/static int registerstantings(Jnienv * env)if(!注冊方法(環(huán)境、類路徑名、方法、大小(方法)/大小(方法0)返回JNI _假;返回JNI真;/* *為一個類注冊幾個本機(jī)方法*/static int registerstantinommethods(Jnienv * env,const char* className,JNINativeMethod * gMethods,int numMethods)jclass clazz;clazz=env-FindCLaSS(CL

10、aSS name);如果(clazz=NULL) LOGE(本地注冊找不到類%s,CLaSS NAmE);返回JNI假;如果(env-registerstanies(clazz,gMethods,numMethods) 0) LOGE(注冊%s,類名的注冊失敗);返回JNI假;返回JNI真;靜態(tài)常量字符*類路徑名西蒙/你好世界;靜態(tài)JNINativeMethod方法=printJNI,()Ljava/lang/String;(void *)Java _ com _ Simon _ hello world _ printJNI,了解知識,也可以不用ndk進(jìn)行編譯直接用armeabilinux編譯

11、器在linux下編譯。因此文件(如何實現(xiàn))Jni的非簡單類型參數(shù)如何傳遞Android.mk文件的編寫規(guī)范,Linux庫回調(diào)爪哇島步驟,1,獲取類名:jclass cls=env-FindClass 2,獲取類方法:jmmethod mid=env-GetMethod 3,獲取類成員變量:fieldID fid=env-GetFieldID 4,生成類對象:作業(yè)對象對象=環(huán)境-新對象(作業(yè)等)也可以從爪哇島層傳下來)5、調(diào)用類成員方法:env-CallXXXMethod(XXX為爪哇島方法的返回值類型),例子,首先是爪哇島的代碼,首老師成一個JniTest類,里面有個sayHelloFromJ

12、ava的方法,我們要實現(xiàn)的目標(biāo)是在C里面賦值(字符串),兩個整形值(int index1,int index2),一個整形數(shù)組(在數(shù)組中),然后在爪哇島里面將這些數(shù)值打印出來1 .公共類JniTest擴(kuò)展了活動2 ./*首次創(chuàng)建活動時調(diào)用*/3 .超越4 .創(chuàng)建時公共無效(捆綁保存實例)5 .超級。OnCreate(SaveDinstancestate);6.設(shè)置內(nèi)容視圖(r .布局main);7.JNI j=新JNI();8.j .寫入();9.10.11。公共jnitest(12)20 .13.日志1(測試,JniTest構(gòu)造函數(shù));14.公共int sayHelloFromJava(字符

13、串int index1,int index2,int intArray)日志日志1(測試,索引1=索引1,索引2=索引2);int JavaIndex=5;for(int I=0;I in array . length I)log . I(TEST,Intraray I=Intraray I);返回javaIndex,Jni類JNI公共二班。靜態(tài)3 .4 .系統(tǒng)。loadLibrarY(myjni);5.6 .公共本機(jī)無效寫入();7.C里面的代碼,JNIEXport void JNICALL Java _ cc _ andoridos _ JNI _ JNI _ write .(工作項目j)LOGI(電話測試);字符串字符串=空;jclass clz=env-FindClass(cc/andro idos/JNI/Jnitest);jmethodctor=env-GetMethodId(clz,)(V);作業(yè)對象obj=env-NewObject(clz,ctor);jmmethod mid=env-GetMethod(clz,sayHelloFromJava,(Ljava/lang/String;三(一);如果LOGI(中是get);jstring s

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論