Android自助餐之Jni(六)NDK入門
Android自助餐專欄
Android自助餐之Jni(一)最簡單的運行
Android自助餐之Jni(二)靜態導入so文件
Android自助餐之Jni(三)動態導入so文件
Android自助餐之Jni(四)在線導入so文件
Android自助餐之Jni(五)進階
Android自助餐之Jni(六)NDK入門
用途
- 兼容不同平臺
- 複用代碼庫,或向外提供庫
- 提高運行效率
步驟
- 設計app,明確Java與native的分工
- 創建Project
- 如果用到了
NativeActivity
,需要在AndroidManiFest.xml
聲明 - 創建
Android.mk
與Application.mk
- 在
jni
文件夾編寫native代碼 - 生成
.so
或.a
文件 - 生成
.dex
文件 - 生成
apk
文件
Android.mk
文件內容
LOCAL_PATH :=$(call my-dir)
指明代碼文件根目錄,該目錄包含本Android.mk文件。Android.mk文件比以此開頭include $(CLEAR_VARS)
清除LOCAL_PATH之外的LOCAL_開頭的變量。必須在描述module前定義此變量LOCAL_MODULE := jni-demo
聲明該jni的module名稱,build後該module將生成libjni-demo.so文件。
如果module的名稱本來就以lib
開頭,則生成的so文件不會再增加lib
前綴。此舉是爲了支持安卓自帶的源碼,他們都是以lib
開頭的LOCAL_SRC_FILES := hello-jni.c
列舉需要被build的c或c++文件,多個文件用空格隔開。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_MODULE
和LOCAL_SRC_FILE
之後使用,語法:include $(BUILD_SHARED_LIBRARY)
1. BUILD_STATIC_LIBRARY
build一個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描述變量
LOCAL_PATH
LOCAL_MODULE
LOCAL_MODULE_FILENAME
LOCAL_SRC_FILES
LOCAL_CPP_EXTENSION
LOCAL_CPP_FEATURES
LOCAL_C_INCLUDE
LOCAL_CFLAGS
LOCAL_CPPFLAGS
LOCAL_STATIC_LIBRARIES
LOCAL_SHARED_LIBRARIES
LOCAL_WHOLE_STATIC_LIBRARIES
LOCAL_LDLIBS
LOCAL_LDFLAGS
LOCAL_ALLOW_UNDEFINED_SYMBOLS
LOCAL_ARM_MODE
LOCAL_ARM_NEON
LOCAL_DISABLE_NO_EXECUTE
LOCAL_DISABLE_RELRO
LOCAL__DISABLE_FORMAT_STRING_CHECKS
LOCAL_EXPORT_CFLAGS
LOCAL_EXPORT_CPPFLAGS
LOCAL_EXPORT_C_INCLUDES
LOCAL_EXPORT_LDFLAGS
LOCAL_EXPORT_LDLIBS
LOCAL_SHORT_COMMANDS
LOCAL_THIN_ARCHIVE
LOCAL_FILTER_ASM
NDK提供的方法宏
my-dir
all-subdir-makefiles
this-makefile
parent-makefile
grand-parent-makefile
import-module
Application.mk
其他
- 如果兩個方法有同樣簽名,則會報出連接錯誤
link error
,C中的簽名僅包括方法名,C++中的簽名包括方法名及參數。