1. 程式人生 > >Android自助餐之Jni(六)NDK入門

Android自助餐之Jni(六)NDK入門

Android自助餐之Jni(六)NDK入門

Android自助餐專欄

Android自助餐之Jni(一)最簡單的執行

Android自助餐之Jni(二)靜態匯入so檔案

Android自助餐之Jni(三)動態匯入so檔案

Android自助餐之Jni(四)線上匯入so檔案

Android自助餐之Jni(五)進階

Android自助餐之Jni(六)NDK入門

用途

  1. 相容不同平臺
  2. 複用程式碼庫,或向外提供庫
  3. 提高執行效率

步驟

  1. 設計app,明確Java與native的分工
  2. 建立Project
  3. 如果用到了NativeActivity,需要在AndroidManiFest.xml宣告
  4. 建立Android.mkApplication.mk
  5. jni資料夾編寫native程式碼
  6. 生成.so.a檔案
  7. 生成.dex檔案
  8. 生成apk檔案

Android.mk

檔案內容

  1. LOCAL_PATH :=$(call my-dir)
    指明程式碼檔案根目錄,該目錄包含本Android.mk檔案。Android.mk檔案比以此開頭
  2. include $(CLEAR_VARS)清除LOCAL_PATH之外的LOCAL_開頭的變數。必須在描述module前定義此變數
  3. LOCAL_MODULE := jni-demo宣告該jni的module名稱,build後該module將生成libjni-demo.so檔案。
    如果module的名稱本來就以lib開頭,則生成的so檔案不會再增加lib字首。此舉是為了支援安卓自帶的原始碼,他們都是以lib開頭的
  4. LOCAL_SRC_FILES := hello-jni.c列舉需要被build的c或c++檔案,多個檔案用空格隔開。
  5. include $(BUILD_SHARED_LIBRARY)集合所有資訊並build到一起。

ndk已定義變數

自定義變數時,需要注意系統保留變數名:以LOCAL_ PRIVATE_ NDK_ APP開頭的變數名;小寫字母的變數(如my-dir)。推薦使用MY_開頭來定義自己的變數。
1. CLEAR_VARS取消定義以LOCAL_開頭的變數,需要在描述module前使用,語法:include $(CLEAR_VARS)
1. BUILD_SHARED_LIBRARY決定如何build,需要在指定LOCAL_MODULELOCAL_SRC_FILE之後使用,語法:include $(BUILD_SHARED_LIBRARY)
1. BUILD_STATIC_LIBRARYbuild一個static的library。生成的庫不會被copy到project和包中,但是可以被用來build到shared的library。語法:include $(BUILD_STATIC_LIBRARY)
1. PREBUILT_SHARED_LIBRARY用於build一個使用了其他SHARED_LIBRARY的library,這裡的LOCAL_SRC_FILES的值不是程式碼檔案,而是已build的庫檔案(如foo或libfoo.so)。用法:include $(PREBUILT_SHARED_LIBRARY)
1. PREBUILT_STATIC_LIBRARY用於build一個使用了其他STATIC_LIBRARY的library,其他同PREBUILT_SHARED_LIBRARY
1. TARGET_ARCH指明目標CPU架構的名稱
1. TARGET_PLATFORM指明目標平臺的Android版本,比如用於5.1系統則為TARGET_PLATFORM = android-22
1. TARGET_ARCH_ABI存放目標CPU的架構名。用法:TARGET_ARCH_ABI :=arm64-v8a
|CPU|Setting|
|:—:|:—:|
|ARMv5TE|armeabi|
|ARMv7|armeabi-v7a|
|ARMv8 AArch64|arm64-v8a|
|i686|x86|
|x86-64|x86_64|
|mips32(r1)|mips|
|mpis64(r6)|mips64|
|All|all|
1. TARGET_ABI同時制定android平臺和CPU架構,用法TARGET_ABI := android-22-arm64-v8a

module描述變數

  1. LOCAL_PATH
  2. LOCAL_MODULE
  3. LOCAL_MODULE_FILENAME
  4. LOCAL_SRC_FILES
  5. LOCAL_CPP_EXTENSION
  6. LOCAL_CPP_FEATURES
  7. LOCAL_C_INCLUDE
  8. LOCAL_CFLAGS
  9. LOCAL_CPPFLAGS
  10. LOCAL_STATIC_LIBRARIES
  11. LOCAL_SHARED_LIBRARIES
  12. LOCAL_WHOLE_STATIC_LIBRARIES
  13. LOCAL_LDLIBS
  14. LOCAL_LDFLAGS
  15. LOCAL_ALLOW_UNDEFINED_SYMBOLS
  16. LOCAL_ARM_MODE
  17. LOCAL_ARM_NEON
  18. LOCAL_DISABLE_NO_EXECUTE
  19. LOCAL_DISABLE_RELRO
  20. LOCAL__DISABLE_FORMAT_STRING_CHECKS
  21. LOCAL_EXPORT_CFLAGS
  22. LOCAL_EXPORT_CPPFLAGS
  23. LOCAL_EXPORT_C_INCLUDES
  24. LOCAL_EXPORT_LDFLAGS
  25. LOCAL_EXPORT_LDLIBS
  26. LOCAL_SHORT_COMMANDS
  27. LOCAL_THIN_ARCHIVE
  28. LOCAL_FILTER_ASM

NDK提供的方法巨集

  1. my-dir
  2. all-subdir-makefiles
  3. this-makefile
  4. parent-makefile
  5. grand-parent-makefile
  6. import-module

Application.mk

其他

  1. 如果兩個方法有同樣簽名,則會報出連線錯誤link error,C中的簽名僅包括方法名,C++中的簽名包括方法名及引數。