JNI学习---关于Android.mk/Application.mk

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/johnWcheung/article/details/81367388

Android.mk 用于将 C 和 C++ 源文件粘合至 Android NDK 。
Application.mk 用于描述应用需要的原生模块。 模块可以是静态库、共享库或可执行文件。

Android.mk

# 此变量表示源文件在开发树中的位置
# 在这里,构建系统提供的宏函数 my-dir 将返回当前目录(包含 Android.mk 文件本身的目录)的路径
LOCAL_PATH := $(call my-dir)

# 清除除了LOCAL_PATH之外的所有LOCAL_XXX变量
# 这个清理动作是必须的,因为所有的编译控制文件由同一个GNU Make解析和执行,其变量是全局的。所以清理后才能避免相互影响
include $(CLEAR_VARS)

# 表示Android.mk中的每一个模块,名字必须唯一且不包含空格
# 构建系统在生成最终共享库文件时,会将正确的前缀和后缀自动添加到您分配给 LOCAL_MODULE 的名称
LOCAL_MODULE := hello-jni

# 此可选变量可让您覆盖构建系统默认用于其生成的文件的名称
# 例如,如果 LOCAL_MODULE 的名称为 foo,您可以强制系统将它生成的文件命名为 libnewfoo
LOCAL_MODULE_FILENAME := libhello-jni

# 枚举源文件,以空格分隔多个文件
# LOCAL_SRC_FILES 变量必须包含要构建到模块中的 C 和/或 C++ 源文件列表
LOCAL_SRC_FILES =: src/hello-jni.cpp \
                   src/hello-jnicallback.cpp

# 此变量用于存储当前模块依赖的静态库模块列表
# 如果当前模块是共享库或可执行文件,此变量将强制这些库链接到生成的二进制文件
# 如果当前模块是静态库,此变量只是指示,依赖当前模块的模块也会依赖列出的库
LOCAL_STATIC_LIBRARIES := world-jni

# 此变量包含在构建共享库或可执行文件时要使用的其他链接器标志列表
# 它可让您使用 -l 前缀传递特定系统库的名称
# 例如,以下示例 -lz 指示链接器生成在加载时链接到 /system/lib/libz.so 的模块
LOCAL_LDLIBS := -llog -lz -lm -landroid

# 设置头文件的include目录
LOCAL_C_INCLUDES := $(LOCAL_PATH)//include

# 指向 GNU Makefile 脚本,用于收集您自最近 include 后在 LOCAL_XXX 变量中定义的所有信息
# 此脚本确定要构建的内容及其操作方法
# BUILD_STATIC_LIBRARY: 编译为静态库,静态库变量导致构建系统生成扩展名为 .a 的库
# BUILD_SHARED_LIBRARY: 编译为动态库,共享库变量导致构建系统生成具有 .so 扩展名的库文件
# BUILD_EXECUTABLE: 编译为Native C可执行程序
# BUILD_PREBUILT: 该模块已经预先编译,指向预建共享库的单一路径,例如 foo/libfoo.so
include $(BUILD_SHARED_LIBRARY)

Application.mk

# 此变量用于存储应用项目根目录的绝对路径
# 构建系统使用此信息将生成的 JNI 共享库的简缩版放入 APK 生成工具已知的特定位置
# 如果将 Application.mk 文件放在 $NDK/apps/<myapp>/ 下,则必须定义此变量
# 如果将其放在 $PROJECT/jni/ 下,则此变量可选
# APP_PROJECT_PATH

# 将此可选变量定义为 release 或 debug,在构建应用的模块时可使用它来更改优化级别
# 发行模式是默认模式,可生成高度优化的二进制文件。调试模式会生成未优化的二进制文件,更容易调试
# 请注意,您可以调试发行或调试二进制文件。但发行二进制文件在调试时提供的信息较少
# 例如,构建系统会选择某些合适的变量,您无需检查它们
# 此外,代码重新排序可能增大单步调试代码的难度;堆叠追踪可能不可靠
# 在应用清单的 <application> 标记中声明 android:debuggable 将导致此变量默认使用 debug而非 release
# 将 APP_OPTIM 设置为 release 可替换此默认值
# APP_OPTIM

# 指定机器指令集
# APP_ABI := all
APP_ABI := armeabi-v7a arm64-v8a

# 目标 Android 平台的名称
APP_PLATFORM := android-26

猜你喜欢

转载自blog.csdn.net/johnWcheung/article/details/81367388