编译原理与语法(三)——Android.mk
2019-10-10 本文已影响0人
王志强_9380
简单的例子
# 定义模块当前路径
LOCAL_PATH := $(call my-dir)
# 清空当前环境变量(LOCAL_PATH除外)
include $(CLEAR_VARS)
# 当前模块名(这里会生成hello-jni.so)
LOCAL_MODULE := hello-jni
# 当前模块包含的源代码文件
LOCAL_SRC_FILES := hello-jni.c
# 当前模块将被编译成一个共享库
include $(BUILD_SHARED_LIBRARY)
编译多个共享库
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)
这个会生成libmodule1.so和libmodule2.so两个动态库
编译静态库
虽然Android应用程序不能直接使用静态库,静态库可以用来编译动态库。
比如在将第三方代码添加到原生项目中时,可以不用直接将第三方源码包括在原生项目中,而是将第三方源码编译成静态库,然后并入共享库
LOCAL_PATH := $(call my-dir)
# 第三方库
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 := avilib
include $(BUILD_SHARED_LIBRARY)
使用共享库共享通用模块
静态库可以保证源代码模块化,但是当静态库与共享库相连时,它就变成了共享库的一部分。在多个共享库的情况下,多个共享库与静态库连接时,需要将通用模块的多个副本与不同的共享库重复相连,这样就增加了app的大小。这种情况下,可以将通用模块作为共享库
LOCAL_PATH := $(call my-dir)
# 第三方库
include $(CLEAR_VARS)
LOCAL_MODULE := avilib
LOCAL_SRC_FILES := avilib.c platform_posix.c
include $(BUILD_SHARED_LIBRARY)
# 原生模块1
include $(CLEAR_VARS)
LOCAL_MODULE := module1
LOCAL_SRC_FILES := module1.c
LOCAL_SHARED_LIBRARIES := avilib
include $(BUILD_SHARED_LIBRARY)
# 原生模块2
include $(CLEAR_VARS)
LOCAL_MODULE := module2
LOCAL_SRC_FILES := module2.c
LOCAL_SHARED_LIBRARIES := avilib
include $(BUILD_SHARED_LIBRARY)
在多个NDK项目间共享模块
# avilib模块自己的mk文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := avilib
LOCAL_SRC_FILES := avilib.c platform_posix.c
include $(BUILD_SHARED_LIBRARY)
# 原生模块1的mk文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := module1
LOCAL_SRC_FILES := module1.c
LOCAL_SHARED_LIBRARIES := avilib
include $(BUILD_SHARED_LIBRARY)
$(call import-module,transcode/avilib)
# 原生模块2的mk文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := module2
LOCAL_SRC_FILES := module2.c
LOCAL_SHARED_LIBRARIES := avilib
include $(BUILD_SHARED_LIBRARY)
$(call import-module,transcode/avilib)
使用预编译库
- 想在不发布源码的情况下将模块发布给他人
- 想使用共享模块的预编译版来加速编译过程
LOCAL_PATH := $(call my-dir)
# 第三方预编译的库
include $(CLEAR_VARS)
LOCAL_MODULE := avilib
LOCAL_SRC_FILES := libavilib.so
include $(PREBUILD_SHARED_LIBRARY)
编译独立的可执行文件
为了方便测试和快速开发,可以编译成可执行文件。不用打包成apk就可以直接复制到android设备上运行
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := module
LOCAL_SRC_FILES := module.c
LOCAL_STATIC_LIBRARIES := avilib
include $(BUILD_EXECUTABLE)