




已閱讀5頁(yè),還剩17頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(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ǔ)言寫(xiě)的代碼進(jìn)行交互 JNI是本地編程接口 它使得在Java虛擬機(jī) VM 內(nèi)部運(yùn)行的Java代碼能夠與用其它編程語(yǔ)言 如C C 和匯編語(yǔ)言 編寫(xiě)的應(yīng)用程序和庫(kù)進(jìn)行交互操作 JNI工作機(jī)制 JAVA VM Linux組件 C C Java類(lèi)編譯為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 每次編寫(xiě)好程序代碼后 啟動(dòng)cygwin 然后執(zhí)行ndk編譯命令編譯 JNI開(kāi)發(fā)步驟 1 采用標(biāo)準(zhǔn)c或c 語(yǔ)言編寫(xiě)程序2 類(lèi)似于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編寫(xiě)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 編寫(xiě)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)前模塊的名稱(chēng)3 LOCAL SHARED LIBRARIES當(dāng)前模塊需要依賴(lài)的共享庫(kù) 因?yàn)樵趆ellowold中我們調(diào)用Android打印系統(tǒng)輸出到logger 所以我們必須要依賴(lài)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ò)查詢(xún)表格就可以找到需要調(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)單類(lèi)型參數(shù)如何傳遞Android mk文件的編寫(xiě)規(guī)范 Linux庫(kù)回調(diào)java步驟 1 獲取類(lèi)名 jclasscls env FindClass2 獲取類(lèi)方法 jmethodIDmid env GetMethodID3 獲取類(lèi)成員變量 fieldIDfid env GetFieldID4 生成類(lèi)對(duì)象 jobjectobj env NewObject jobect也可以從Java層傳下來(lái) 5 調(diào)用類(lèi)成員方法 env CallXXXMethod XXX為Java方法的返回值類(lèi)型 例子 首先是Java的代碼 首先生成一個(gè)JniTest類(lèi) 里面有個(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類(lèi) 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)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 環(huán)保產(chǎn)業(yè)園區(qū)的產(chǎn)業(yè)集聚與區(qū)域綠色產(chǎn)業(yè)融合協(xié)同發(fā)展報(bào)告
- 保育員實(shí)操考試題目及答案
- 安全專(zhuān)題試題及答案
- 影視行業(yè)高質(zhì)量制作指南:2025年工業(yè)化流程與質(zhì)量控制深度分析報(bào)告
- 農(nóng)業(yè)溫室智能化改造可行性研究報(bào)告
- 2025年廢棄礦井資源再利用與礦山安全生產(chǎn)技術(shù)革新報(bào)告
- 安全生產(chǎn)試題及答案文本
- 安全工作競(jìng)聘試題及答案
- 2025年家庭教育指導(dǎo)行業(yè)市場(chǎng)細(xì)分領(lǐng)域競(jìng)爭(zhēng)格局研究報(bào)告
- 農(nóng)產(chǎn)品質(zhì)量安全追溯體系在農(nóng)產(chǎn)品生產(chǎn)環(huán)節(jié)中的應(yīng)用與實(shí)踐研究報(bào)告
- 2023年無(wú)錫宜興市小升初英語(yǔ)考試模擬試題及答案解析
- 突發(fā)飲用水污染事件和衛(wèi)生監(jiān)督專(zhuān)家講座
- 半導(dǎo)體材料(總結(jié))
- 沃爾瑪收貨規(guī)定
- 2022年丹東市元寶區(qū)社區(qū)工作者招聘筆試題庫(kù)及答案解析
- 小學(xué)道德與法治人教五年級(jí)上冊(cè)(統(tǒng)編)第三單元我們的國(guó)土我們的家園-愛(ài)國(guó)教案
- 藝術(shù)欣賞完整版課件全套ppt教程(最新)
- GB∕T 2518-2019 連續(xù)熱鍍鋅和鋅合金鍍層鋼板及鋼帶
- 土地項(xiàng)目測(cè)算表_模板
- 教育培訓(xùn)機(jī)構(gòu)輔導(dǎo)老師月度績(jī)效考核表(KPI)
- 立式水輪機(jī)組軸線(xiàn)調(diào)整及導(dǎo)軸承的間隙分配ppt課件
評(píng)論
0/150
提交評(píng)論