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