Android自助餐之Jni(六)NDK入門
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)
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++中的簽名包括方法名及引數。