2.4.1 Android.mk(2)
2. 构建多个共享库
基于不同的应用程序的体系结构,一个单独的Android.mk文档可能产生多个共享库模块。为了达到这个目的,需要如程序清单2-2所示在Android.mk文档中定义多个模块。
程序清单2-2 带有多个共享库模块的Android.mk构建文件
- LOCAL_PATH := $(call my-dir)
-
- #
- #模块 1
- #
- include $(CLEAR_VARS)
-
- LOCAL_MODULE := module1
- LOCAL_SRC_FILES := module1.c
- include $(BUILD_SHARED_LIBRARY)
-
- #
- #模块 2
- #
- include $(CLEAR_VARS)
-
- LOCAL_MODULE := module2
- LOCAL_SRC_FILES := module2.c
-
- include $(BUILD_SHARED_LIBRARY)
在处理完这个Android.mk构建文档之后,Android NDK构建系统会产生libmodule1.so和libmodule2.so两个共享库。
3. 构建静态库
Android NDK构建系统也支持静态库。实际的Android应用程序并不直接使用静态库,并且应用程序包中也不包含静态库。静态库可以用来构建共享库。例如,在将第三方代码添加到现有原生项目中时,不用直接将第三方源代码包括在原生项目中,而是将第三方代码编译成静态库然后并入共享库,如程序清单2-3所示。
程序清单2-3 在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)
-
- #
- # 原生模块
- #
- include $(CLEAR_VARS)
-
- LOCAL_MODULE := module
- LOCAL_SRC_FILES := module.c
-
- LOCAL_STATIC_LIBRARIES := avilib
-
- include $(BUILD_SHARED_LIBRARY)
在将第三方代码模块生成静态库之后,共享库就可以通过将它的模块名添加到LOCAL_STATIC_LIBRARIES变量中来使用该模块。
4. 用共享库共享通用模块
静态库可以保证源代码模块化;但是,当静态库与共享库相连时,它就变成了共享库的一部分。在多个共享库的情况下,多个共享库与同一个静态库连接时,需要将通用模块的多个副本与不同共享库重复相连,这样就增加了应用程序的大小。在这种情况下,不用构建静态库,而是将通用模块作为共享库建立起来,而动态连接依赖模块以便消除重复的副本(见程序清单2-4)。
程序清单2-4 Android.mk 文件中共享库之间的代码共享
- LOCAL_PATH := $(call my-dir)
-
- #
- # 第三方AVI库
- #
- 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)
喜欢的朋友可以添加我们的微信账号:
51CTO读书频道二维码

51CTO读书频道活动讨论群:342347198