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++中的簽名包括方法名及參數。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章