您的位置:首页 > 移动开发 > Android开发

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

2016-06-18 01:12 351 查看

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

Android自助餐之Jni六NDK入门

Android自助餐专栏

Android自助餐之Jni一最简单的运行

Android自助餐之Jni二静态导入so文件

Android自助餐之Jni三动态导入so文件

Android自助餐之Jni四在线导入so文件

Android自助餐之Jni五进阶

Android自助餐之Jni六NDK入门

用途

步骤

Androidmk
文件内容

ndk已定义变量

module描述变量

NDK提供的方法宏

Applicationmk

其他

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++中的签名包括方法名及参数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: