jni工作機(jī)制簡(jiǎn)介.ppt_第1頁(yè)
jni工作機(jī)制簡(jiǎn)介.ppt_第2頁(yè)
jni工作機(jī)制簡(jiǎn)介.ppt_第3頁(yè)
jni工作機(jī)制簡(jiǎn)介.ppt_第4頁(yè)
jni工作機(jī)制簡(jiǎn)介.ppt_第5頁(yè)
已閱讀5頁(yè),還剩17頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

Androidjava層與linux底層相互調(diào)用 Android與linux底層程序互調(diào)用 Android調(diào)用底層程序java程序如何訪問(wèn)windows linux底層c c的程序 JNI JavaNativeInterfaceJNI標(biāo)準(zhǔn)是java平臺(tái)的一部分 它允許Java代碼和其他語(yǔ)言寫的代碼進(jìn)行交互 JNI是本地編程接口 它使得在Java虛擬機(jī) VM 內(nèi)部運(yùn)行的Java代碼能夠與用其它編程語(yǔ)言 如C C 和匯編語(yǔ)言 編寫的應(yīng)用程序和庫(kù)進(jìn)行交互操作 JNI工作機(jī)制 JAVA VM Linux組件 C C Java類編譯為Dex型式的Bytecode之后必須靠Dalvik虛擬機(jī)來(lái)執(zhí)行 JNI開(kāi)發(fā)環(huán)境 ndk 推薦 Android提供了windows和linux下的JNI開(kāi)發(fā)環(huán)境ndk NativeDevelopmentKit交叉編譯器編譯的代碼符合arm linux提供了用于編譯的android基本sdk庫(kù)提供了bash方式的編譯命令 使用非常簡(jiǎn)單Linux下ndk配置linux下直接下載并解壓ndk開(kāi)發(fā)包即可 Ndk windows開(kāi)發(fā)環(huán)境 Ndk是在linux下運(yùn)行的程序 在windows上需要模擬一個(gè)linux環(huán)境才能執(zhí)行ndk 怎么模擬 cygwinWindows配置ndk步驟 1 下載windows版本的ndk 2 安裝cygwin 并被指ndk環(huán)境3 每次編寫好程序代碼后 啟動(dòng)cygwin 然后執(zhí)行ndk編譯命令編譯 JNI開(kāi)發(fā)步驟 1 采用標(biāo)準(zhǔn)c或c 語(yǔ)言編寫程序2 類似于linux在makefile android的jni編譯需要 mk文件編譯 采用命令ndk bulid 例子 1 我們選擇ndk自帶的例子hello jni 我的位于E android ndk r5 samples hello jni 根據(jù)你具體的安裝位置而定 2 運(yùn)行cygwin 輸入命令cd cygdrive e android ndk r5 samples hello jni 進(jìn)入到E android ndk r5 samples hello jni目錄 3 輸入 NDK ndk build 執(zhí)行成功后 它會(huì)自動(dòng)生成一個(gè)libs目錄 把編譯生成的 so文件放在里面 NDK是調(diào)用我們之前配置好的環(huán)境變量 ndk build是調(diào)用ndk的編譯程序 4 此時(shí)去hello jni的libs目錄下看有沒(méi)有生成的 so文件 舉例 我們首先用java編寫helloworld應(yīng)用程序 APK 這個(gè)代碼很簡(jiǎn)單創(chuàng)建一個(gè)HelloWorldactivitypublicclassHelloWorldextendsActivity privatestaticfinalStringTAG HelloWorld static System loadLibrary helloworld privatenativeStringprintJNI Calledwhentheactivityisfirstcreated OverridepublicvoidonCreate BundlesavedInstanceState super onCreate savedInstanceState setContentView R layout main Log d TAG ActivitycallJNI printJNI C語(yǔ)言實(shí)現(xiàn)helloworld共享庫(kù) 使用javah工具 可以根據(jù)java源程序 生成Native代碼的頭文件javahcom simon HelloWorld注意 該命令必須在bin classes下執(zhí)行執(zhí)行后得到 一個(gè)頭文件com simon Helloworld h 這里包含有printJNI接口的C C 聲明 創(chuàng)建com simon Helloworld c文件 include defineLOG TAG HelloWorld include Nativeinterface itwillbecallinjavacode JNIEXPORTjstringJNICALLJava com simon HelloWorld printJNI JNIEnv env jobjectobj LOGI HelloWorldFromlibhelloworld so return env NewStringUTF env HelloWorld Thisfunctionwillbecallwhenthelibraryfirstbeload Youcandosomeinitinthelibray returnwhichversionjniitsupport jintJNI OnLoad JavaVM vm void reserved void venv LOGI JNI OnLoad if vm GetEnv vm void 編寫Android mk LOCAL PATH callmy dir include CLEAR VARS LOCAL SRC FILES com simon Helloworld cLOCAL C INCLUDES JNI H INCLUDE LOCAL MODULE libhelloworldLOCAL SHARED LIBRARIES libutilsLOCAL PRELINK MODULE include BUILD SHARED LIBRARY 1 LOCAL C INCLUDES說(shuō)明包含的頭文件 這里需要包含JNI的頭文件 2 LOCAL MODULE當(dāng)前模塊的名稱3 LOCAL SHARED LIBRARIES當(dāng)前模塊需要依賴的共享庫(kù) 因?yàn)樵趆ellowold中我們調(diào)用Android打印系統(tǒng)輸出到logger 所以我們必須要依賴libutils庫(kù) 4 LOCAL PRELINK MODULE指明該模塊是否被啟動(dòng)就加載 我們的helloworld庫(kù)不需要prelink 所以置為false JNIAPI為了避免丑陋的函數(shù)名 提供了方法向Java虛擬機(jī)注冊(cè)函數(shù)映射表 這樣當(dāng)Java調(diào)用Native接口的時(shí)候 Java虛擬機(jī)就可以不用根據(jù)函數(shù)名來(lái)決定調(diào)用哪個(gè)函數(shù)了 直接通過(guò)查詢表格就可以找到需要調(diào)用的函數(shù)了 Thisfunctionwillbecallwhenthelibraryfirstbeloaded jintJNI OnLoad JavaVM vm void reserved UnionJNIEnvToVoiduenv JNIEnv env NULL LOGI JNI OnLoad if vm GetEnv void Registernativemethodsforallclassesweknowabout returnsJNI TRUEonsuccess staticintregisterNatives JNIEnv env if registerNativeMethods env classPathName methods sizeof methods sizeof methods 0 returnJNI FALSE returnJNI TRUE Registerseveralnativemethodsforoneclass staticintregisterNativeMethods JNIEnv env constchar className JNINativeMethod gMethods intnumMethods jclassclazz clazz env FindClass className if clazz NULL LOGE Nativeregistrationunabletofindclass s className returnJNI FALSE if env RegisterNatives clazz gMethods numMethods 0 LOGE RegisterNativesfailedfor s className returnJNI FALSE returnJNI TRUE staticconstchar classPathName com simon HelloWorld staticJNINativeMethodmethods printJNI Ljava lang String void Java com simon HelloWorld printJNI 了解知識(shí) 也可以不用ndk進(jìn)行編譯直接用armeabilinux編譯器在linux下編譯 so文件 如何實(shí)現(xiàn) Jni的非簡(jiǎn)單類型參數(shù)如何傳遞Android mk文件的編寫規(guī)范 Linux庫(kù)回調(diào)java步驟 1 獲取類名 jclasscls env FindClass2 獲取類方法 jmethodIDmid env GetMethodID3 獲取類成員變量 fieldIDfid env GetFieldID4 生成類對(duì)象 jobjectobj env NewObject jobect也可以從Java層傳下來(lái) 5 調(diào)用類成員方法 env CallXXXMethod XXX為Java方法的返回值類型 例子 首先是Java的代碼 首先生成一個(gè)JniTest類 里面有個(gè)sayHelloFromJava的方法 我們要實(shí)現(xiàn)的目標(biāo)是在C 里面賦值 Stringstr 兩個(gè)整形值 intindex1 intindex2 一個(gè)整形數(shù)組 int intArray 然后在Java里面將這些數(shù)值打印出來(lái) 1 publicclassJniTestextendsActivity 2 Calledwhentheactivityisfirstcreated 3 Override4 publicvoidonCreate BundlesavedInstanceState 5 super onCreate savedInstanceState 6 setContentView R layout main 7 JNIj newJNI 8 j write 9 10 11 publicJniTest 12 13 Log i TEST JniTestConstructor 14 publicintsayHelloFromJava Stringstr intindex1 intindex2 int intArray Log i TEST str ButIamshowinjava Log i TEST index1 index1 index2 index2 intjavaIndex 5 for inti 0 i intArray length i Log i TEST intArray i intArray i returnjavaIndex Jni類 1 publicclassJNI 2 static3 4 System loadLibrary myjni 5 6 publicnativevoidwrite 7 C 里面的代碼 JNIEXPORTvoidJNICALLJava cc androidos jni JNI write JNIEnv env jobjectj LOGI calltest jstringstr NULL jclassclz env FindClass cc androidos jni JniTest jmethodIDctor env GetMethodID clz V jobjectobj env NewObject clz ctor jmethodIDmid env GetMethodID clz sayHelloFromJava Ljava lang String II I I if mid LOGI midisget jstringstr1 env NewStringUTF IamNative jintindex1 10 jintindex2 12 jintArraytestIntArray env NewIntA

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論