Android.mk格式

3 篇文章 0 订阅

基本格式

  • 定义模块当前路径(必须定义在文件开头,只需要定义一次)
    LOCAL_PATH := $(call my-dir)
  • 清空当前环境变量(LOCAL_PATH除外)
    include $(CLEAR_VARS)
  • 当前模块名(这里会生成libhello-jni.so)
    LOCAL_MODULE := hello-jni
  • 当前模块包含的源代码文件
    LOCAL_SRC_FILES := hello-jni.c
  • 表示当前模块将被编译成一个共享库
    include $(BUILD_SHARED_LIBRARY)

编译多个共享库

以下代码会产生libmodule1.so 和 libmodule2.so两个动态库
LOCAL_PATH := $(call my-dir)

//模块一
include $(CLEAR_VARS)
LOCAL_MODULE := module1
LOCAL_SRC_FILES := module1.c
include $(BUILD_SHARED_LIBRARY)
//模块二
include $(CLEAR_VARS)
LOCAL_MODULE := module2
LOCAL_SRC_FILES := module2.c
include $(BUILD_SHARED_LIBRARY)

编译静态库

虽然Android应用程序不能直接使用静态库,但是可以用静态库来编译动态库。比如在将第三方代码添加到原生项目中时,可以不用直接将第三方源码包括在原生项目中,而是将第三方源码编译成静态库,然后并入共享库。

LOCAL_PATH := $(call my-dir)

//第三方AVI库
include $(CLEAR_VARS)
LOCAL_MODULE := avilib
LOCAL_SRC_FILES := avilib.c platform_posix.c
include $(BUILD_STATIC_LIBRARY)

//原生模块
include $(CLEAR_VARS)
LOCAL_MODULE := module
LOCAL_SRC_FILES := module.c
//将静态库模块名添加到LOCAL_STATIC_LIBRARIES变量
LOCAL_STATIC_LIBRARIES := avilib
include $(BUILD_SHARED_LIBRARY)

使用共享库共享通用模块

不能使用静态库
LOCAL_PATH := $(call my-dir)

//第三方AVI库
include $(CLEAR_VARS)
LOCAL_MODULE := avilib
LOCAL_SRC_FILES := avilib.c platform_posix.c
include $(BUILD_STATIC_LIBRARY)

//模块一
include $(CLEAR_VARS)
LOCAL_MODULE := module1
LOCAL_SRC_FILES := module1.c
//将模块名添加到LOCAL_STATIC_LIBRARIES变量
LOCAL_STATIC_LIBRARIES := avilib
include $(BUILD_SHARED_LIBRARY)
//模块二
include $(CLEAR_VARS)
LOCAL_MODULE := module2
LOCAL_SRC_FILES := module2.c
LOCAL_STATIC_LIBRARIES := avilib
include $(BUILD_SHARED_LIBRARY)

在多个NDK项目间共享模块

  1. 首先将avilib源代码移动到NDK项目以外的位置。

  2. 作为共享模块,avilib需要有自己的Android.mk文件
    //avilib模块自己的Android.mk文件
    LOCAL_PATH := $(call my-dir)
    //第三方AVI库
    include $(CLEAR_VARS)
    LOCAL_MODULE := avilib
    LOCAL_SRC_FILES := avilib.c platform_posix.c
    include $(BUILD_STATIC_LIBRARY)

  3. 以transcode/avilib为参数调用函数宏import-module添加到NDK项目的Android.mk文档末尾。
    //使用共享模块的NDK项目1的Android.mk文件
    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_MODULE := module1
    LOCAL_SRC_FILES := module1.c
    //将模块名添加到LOCAL_STATIC_LIBRARIES变量
    LOCAL_STATIC_LIBRARIES := avilib
    include $(BUILD_SHARED_LIBRARY)
    $(call import-module,transcode/avilib)

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := module2
LOCAL_SRC_FILES := module2.c
//将模块名添加到LOCAL_STATIC_LIBRARIES变量
LOCAL_STATIC_LIBRARIES := avilib
include $(BUILD_SHARED_LIBRARY)
$(call import-module,transcode/avilib)

使用预编译库

  1. 想在不发布源代码的情况下将模块发布给他人。
  2. 想使用共享库模块的预编译版来加速编译过程。
    //预编译共享模块的Android.mk文件
    LOCAL_PATH := $(call my-dir)
    //第三方预编译的库
    include $(CLEAR_VARS)
    LOCAL_MODULE := avilib
    LOCAL_SRC_FILES := libavilib.so
    include $(PREBUILT_SHARED_LIBRARY)

编译独立的可执行文件

为了方便测试和进行快速开发,可以编译成可执行文件。不用打包成APK就可以复制到Android设备上直接执行。
//独立可执行模块的Android.mk文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := module
LOCAL_SRC_FILES := module.c
LOCAL_STATIC_LIBRARIES := avilib
include $(BUILD_EXECUTABLE)

注意事项

  • 本地库libhello-jni.so依赖于libTest.so(可以使用NDK下的ndk-depends查看so的依赖关系)
  • 在Android6.0版本之前,需要在加载本地库前先加载被依赖的so。
  • 在Android6.0版本之后,不能再使用预编译的动态库。
    //Android6.0版本之前:
    System.loadLibrary(“Test”);
    System.loadLibrary(“hello-jni”);
    //在Android6.0版本之后:
    System.loadLibrary(“hello-jni”);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这些都是 Android NDK 内部的 `Android.mk` 文件。其中,`./android-ndk-r25c/sources/android/native_app_glue/Android.mk` 是用于编译 Native Activity 示例应用程序的 `Android.mk` 文件;`./android-ndk-r25c/sources/android/support/Android.mk` 是包含一些 Android 支持库的 `Android.mk` 文件;`./android-ndk-r25c/sources/android/ndk_helper/Android.mk` 是包含一些辅助函数和类的 `Android.mk` 文件;`./android-ndk-r25c/sources/android/cpufeatures/Android.mk` 是用于编译 `cpufeatures` 库的 `Android.mk` 文件,该库提供了一些 CPU 相关的信息和功能;`./android-ndk-r25c/sources/cxx-stl/llvm-libc++abi/Android.mk` 和 `./android-ndk-r25c/sources/cxx-stl/llvm-libc++/Android.mk` 是用于编译 C++ STL 库的 `Android.mk` 文件,分别对应 libc++abi 和 libc++ 两个 STL 库;`./android-ndk-r25c/sources/third_party/googletest/Android.mk` 是用于编译 Google Test 测试框架的 `Android.mk` 文件;`./android-ndk-r25c/sources/third_party/shaderc/Android.mk` 是用于编译 Shaderc 编译器的 `Android.mk` 文件,该编译器可以将 GLSL 代码编译成 SPIR-V 代码;`./android-ndk-r25c/sources/third_party/shaderc/libshaderc/Android.mk` 是用于编译 Shaderc 库的 `Android.mk` 文件;`./android-ndk-r25c/sources/third_party/shaderc/libshaderc_util/Android.mk` 是用于编译 Shaderc Util 库的 `Android.mk` 文件,该库提供了一些辅助函数和类;`./android-ndk-r25c/sources/third_party/shaderc/third_party/Android.mk` 是用于编译 Shaderc 编译器依赖的第三方库的 `Android.mk` 文件,包括 glslang 和 spirv-tools 两个库;`./android-ndk-r25c/sources/third_party/shaderc/third_party/glslang/Android.mk` 是用于编译 glslang 库的 `Android.mk` 文件;`./android-ndk-r25c/sources/third_party/shaderc/third_party/spirv-tools/Android.mk` 是用于编译 spirv-tools 库的 `Android.mk` 文件;`./android-ndk-r25c/sources/third_party/vulkan/src/build-android/jni/Android.mk` 是用于编译 Vulkan 库的 `Android.mk` 文件。 如果您要在 Android NDK 中编写自己的 `Android.mk` 文件,可以参考这些示例文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值