NDK安裝
- 訪問 http://developer.android.com/tools/sdk/ndk/index.html ,從Downloads列表中選擇適合你平臺的NDK包
- 解壓下載的NDK包
- 解壓完成後,NDK文件放在一個叫做android-ndk-<version>的目錄中。你可以改變它的名稱,也可以把它移動到任何地方。
- 設置環境變量NDK指向ndk目錄。
打開~/.bashrc文件,添加NDK=/home/robin/Desktop/android-ndk-r9c。
source ~/.bashrc更新環境變量 - echo $NDK有內容輸出,表示配置成功。或者執行$NDK/ndk-build,
Android NDK 簡介
目標
- 你的程序源碼將會使用"native"關鍵字聲明一到多個方法,以指明它們是通過本地代碼實現的。 例如:native byte [] loadFile(String filePath)
- 你還必須提供一個包含這些方法的實現的本地共享庫,共享庫會被打包進你的應用.apk中。共享庫的命名要符合標準的Unix規範(lib*.so,前綴是lib, 後綴是.so),還要包含標準的JNI入口點。
- 你的應用必須顯示的加載用到的共享庫。例如,簡單的通過如下代碼實現應用啓動時加載:
static { System.loadLibrary("FileLoader"); }
- 生成兼容JNI的共享庫,生成的共享庫能夠運行在使用ARM系列CPU的Android 1.5+平臺上。
- Copy生成的共享庫到你的應用項目路徑下的合適位置,以便它們能夠被自動添加到你最終的應用包.apks中
- 在將來的版本中,計劃通過遠程gdb連接來提供幫助調試本地代碼的工具
- 一套交叉工具鏈,幫助在Linux, OS X和windows上產生本地ARM二進制代碼
- 一系列系統頭文件,這些頭文件中包含了Android平臺支持的穩定的本地APIs列表。
- 一套構建系統,允許開發者只需要寫很短的構建文件(build files)來描述哪些源文件需要編譯,怎樣編譯。由構建系統系統處理所有繁雜的工具鏈/平臺/CPU/ABI規範。此外,以後的版本將支持更多的工具鏈,平臺和系統接口,而且不用改變構建文件。
非目標
NDK開發實踐
- 把本地代碼放在$PROJECT/jni/目錄下
- 創建$PROJECT/jni/Android.mk,以向NDK構建系統描述你的項目,這是必須的
- 需要是創建$PROJECT/jni/Android.mk,以更詳細的向構建系統描述你的項目。雖然這一步Android.mk不是必須的,但它允許你構建多CPU應用,或者重設某些編譯/鏈接標誌。
- 在你的工程目錄,或者它的任何子目錄,運行$NDK/ndk-build編譯本地代碼
Android.mk構建腳本
NDK編譯常見問題
NDK編譯C++,提示找不到頭文件
error: fstream: No such file or directory
error: set: No such file or directory
error: string: No such file or directory
解決辦法:
在所在目錄,新建文件Application.mk,添加 APP_STL := gnustl_static。
與STL相關的錯誤
1 異常相關的錯誤
error: exception handling disabled, use -fexceptions to enable。
2 某些STL函數找不到
undefined reference to `__cxa_end_cleanup'
undefined reference to `__cxa_begin_catch'
undefined reference to `__cxa_end_catch'
undefined reference to `__cxa_get_exception_ptr'
可以參考這裏:http://blog.csdn.net/andyhuabing/article/details/8591459
動態庫編譯正常include $(BUILD_SHARED_LIBRARY),改成靜態庫不編譯include $(BUILD_STATIC_LIBRARY)
這是因爲缺少Application.mk文件
解決方法:在<project>\jni\目錄下添加一個Application.mk文件,裏面寫上一行代碼:
APP_MODULES := libexample
注意:libexample的名字要與Android.mk中LOCAL_MODULE=example的名字相同