EClipse开发NDK流程
生活随笔
收集整理的這篇文章主要介紹了
EClipse开发NDK流程
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
EClipse開發(fā)NDK流程(現(xiàn)在studio也在2.2之后支持了非常簡(jiǎn)單,只要?jiǎng)?chuàng)建項(xiàng)目的時(shí)候勾選c++支持就可以了) 什么情況下使用ndk,1.保護(hù)代碼,java很容易反編譯,c/c++反匯編比較難,2.調(diào)用底層代碼,比如人臉識(shí)別3.便于移植,適合更多的嵌入式平臺(tái)再次使用 交叉編譯:是在一個(gè)平臺(tái)生成另一個(gè)平臺(tái)可執(zhí)行的代碼(平臺(tái)的指令集不一樣,比如電腦x86,手機(jī)arm,他們的系統(tǒng)執(zhí)行使用不一樣的), jni是什么 java Native Interface 的縮寫,jni是標(biāo)準(zhǔn)成為java平臺(tái)的一部分,它允許java和其他語(yǔ)言混合開發(fā)進(jìn)行交換 ndk 開發(fā)流程 1.下載ndk的工具,(比如r9d),下載完成后解壓, 2.配置ndk 的開發(fā)環(huán)境, 我們先使用命令行執(zhí)行ndk-build會(huì)得到(命令執(zhí)行完之后不是該命令不是內(nèi)部或外部命令) 這時(shí)候開始配置開發(fā)環(huán)境配置完成之后在執(zhí)行ndk-build會(huì)得到(命令執(zhí)行完之后不是該命令不是內(nèi)部或外部命令), 原因是系統(tǒng)環(huán)境變了,但是命令行還在剛才配置前的環(huán)境,只要新開一個(gè)窗口在執(zhí)行就ok了(一般會(huì)是could not find application.........) 這樣就完成了,could not 原因是,這個(gè)命令需要在一個(gè)安卓項(xiàng)目下執(zhí)行才有效 3.配置eclipseADT插件? 點(diǎn)擊Help-install New software... 點(diǎn)擊add,選擇location的Archive選擇ADT的路徑 ,? 選擇完成后下邊有個(gè)列表,需要全選,最重要的是Android Native Development Tools 一定你要選 然后點(diǎn)擊next,選擇I? accept the......選項(xiàng)(我同意的選項(xiàng)) 然后finish重啟eclipse就行了 到此為止安裝完畢 4.接下來(lái)導(dǎo)入一些簡(jiǎn)單的demo 在r9d下有個(gè)samples是一些簡(jiǎn)單的ndk代碼 接下來(lái)import(最好copy一份到工作空間,不要?jiǎng)釉瓉?lái)的項(xiàng)目)后 5.進(jìn)入該項(xiàng)目的文件夾下,再執(zhí)行ndk-build,執(zhí)行完成后,刷新eclipse中的項(xiàng)目, 此刻會(huì)多了一個(gè)object的文件夾里面包含了arm架構(gòu)的.so包,以及其他的包括x86架構(gòu)的 6. (運(yùn)行到模擬器)最好安裝一個(gè)arm的兼容包(電腦是x86,手機(jī)是arm架構(gòu)) 如果我們不需要這么多架構(gòu)的包,可以在jni的application.mk的文件中通過(guò)#注釋掉APP_ABI:=all 然后再通過(guò)命令執(zhí)行ndk-build clean ,清除掉之前編譯生成的.so文件,刷新項(xiàng)目, 你會(huì)發(fā)現(xiàn),object下的架構(gòu)少了,此時(shí)你再刪除object文件夾,重新執(zhí)行ndk-build,刷新eclipse項(xiàng)目, 然后就只剩一個(gè)arm架構(gòu)的.so了 -------------------------------------------------------------------- 華 ? ?麗 ? ?的 ? ?分 ? ? ? 割 ? ? 線-------------------------------------------------------------------- 開發(fā)自己的第一個(gè)ndk項(xiàng)目流程 第一步創(chuàng)建項(xiàng)目, 第二步項(xiàng)目下創(chuàng)建jni目錄 第三步編寫nativejava層代碼(這里只有方法,沒有方法體,因?yàn)檎{(diào)用的是) 第四步通過(guò)javah命令生成jni頭文件(生成完畢后刷新項(xiàng)目,.h文件就出來(lái)了) 這里要說(shuō)明下.h文件的作用,這里的作用是用來(lái)聲明跟本地語(yǔ)言交互平臺(tái), 進(jìn)行Java與C/C++交叉編譯的工具的平臺(tái),這個(gè)文件不是必須的,但是行業(yè)規(guī)范是必須要寫的,應(yīng)為這樣容易查找, 第五步開發(fā)c 第六 步生成so庫(kù) 第七步加載so庫(kù)使用 1.創(chuàng)建項(xiàng)目(不解釋) 2.創(chuàng)建jni目錄 創(chuàng)建一個(gè)jni目錄(項(xiàng)目的根目錄下) 3.聲明本地方 在mainactivity類中,聲明一個(gè)方法 public static native String getStringFromC(); 注意:這里的一定要寫的兩個(gè)關(guān)鍵字是 native ,以及static, 其中native 毋庸置疑,就是聲明該方法是個(gè)調(diào)用本地的語(yǔ)言的方法, static目的是加載該類的時(shí)候就直接加載該方法,其中如果不寫這個(gè)static 將會(huì)導(dǎo)致.h文件中沒有該方法的簽名(也就是.h文件沒有改方法的聲明的簽名平臺(tái)這個(gè)簽名是有規(guī)則的) 例如:JNIEXPORT void JNICALL Java_com_example_myjni_MainActivity_callMyC(JNIEnv *, jclass);不寫static將沒有這個(gè) 4.生成頭文件 然后生成頭文件,使用命令javah命令得到一個(gè)幫助使用方式, //路徑? ? ? ? //輸出路徑? 包名.類名 進(jìn)入到項(xiàng)目的目錄,使用javah -classpath bin/classes -d jni? com.example.hellon.mainactivity? ? 這樣會(huì)報(bào)錯(cuò),? ? 無(wú)法訪問(wèn)Android.app.Activity....... 原因:它不知道activity在哪 解決方式:javah -classpath bin/classes; 任意sdk的android.jar路徑 -d jni? com.example.hellon.mainactivity? ? 然后回車,刷新eclipsejni文件夾多了一個(gè).h結(jié)尾的文件,接下來(lái)就可以在jni下創(chuàng)建c的文件開發(fā)c層(開發(fā)c層自行再找) 5.c層開發(fā)..... 創(chuàng)建你的.c文件,include 一些c需要使用的.h文件,以及你自己生成的.h文件 (這里eclipse不支持智能提示,你可以百度配置方法的支持自行配置,即便你配置好了對(duì)c的支持不太友好,c++則更好些) 語(yǔ)法問(wèn)題自行找教程 6.生成so庫(kù) 準(zhǔn)備成so庫(kù) 6.1(關(guān)于配置文件) Android.mk文件,他是配置你那些文件需要生成so庫(kù)以及so庫(kù)名稱的,這個(gè)文件直接拷貝一份改改就行了,其中,LOCAL_MOUDLE :=你想生成.so文件的名字 LOCAL_SRC_FILES :=你要編譯的c文件.c 接下來(lái)編譯如同上邊,編譯完成后,刷新,多了.so文件就可以引用了, Application.mk文件主要是編譯那種平臺(tái)的.so文件,這個(gè)文件直接拷貝一份改改就行了 , 其中APP_ABI是配置平臺(tái)的,all代表所有,你也可以指定平臺(tái)架構(gòu),這里可以去讀r9d中的doc文檔中,Application.mk一篇 (這里我們生成so庫(kù)后,.c文件無(wú)法直接影響我們的程序, java調(diào)用so,而so是.c衍生出來(lái)的的, 當(dāng)我們確定好so以后,c基本就喪失了作用, 這里千萬(wàn)不要因?yàn)闆]有了刪除,因?yàn)槟憧赡芤院筮€要對(duì)c文件修改等 ?拓展,所以文件要留存) 6.2 (ndk -bulid ? ) 在項(xiàng)目目錄下使用該命令 生成so庫(kù)后,一定要確保libs下有一份(一般來(lái)講命令生成以后,會(huì)自動(dòng)在項(xiàng)目下的lib中有一份,以及obj下local中也有一份) 7. 最后加載so庫(kù) 在mainactivity引用的時(shí)寫個(gè)靜態(tài)代碼塊static{ System.loadLibrary("你想要加載生成的so文件")} 結(jié)尾: 關(guān)于javah命令有沒有便捷方式問(wèn)題,這個(gè)的確手寫非常累贅,我們可以配置eclipse的配置,詳情配置請(qǐng)自行搜索配置方案 還有就是
轉(zhuǎn)載于:https://www.cnblogs.com/lizhanqi/p/5974534.html
總結(jié)
以上是生活随笔為你收集整理的EClipse开发NDK流程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Oracle中的存储过程简单例子
- 下一篇: 客户端如何通过咏南中间件调用存储过程和数