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++中的签名包括方法名及参数。