文章的内容是从Android开发者官网扒的,为了防止再登不上去,记录一下。官网网址:https://developer.android.com/ndk/guides/prebuilts.html
使用预构建库
NDK 支持使用预构建库,静态库和共享库均受支持。针对此功能提供两个主要用例:
- 向第三方 NDK 开发者分发您自己的库,无需分发您的源代码。
- 使用您自己的库的预构建版本以提升您的构建速度。
本页介绍如何使用预构建库。
声明预构建库
您必须将您使用的每个预构建库声明为单一独立模块。为此,请执行以下步骤:
- 为模块提供一个名称。此名称不需要与预构建库本身的名称相同。
- 在模块的
Android.mk
文件中,将指向您提供的预构建库的路径分配到LOCAL_SRC_FILES
。 指定LOCAL_PATH
变量的值的相对路径。注:您必须确保选择与您的目标 ABI 对应的预构建库版本。 如需了解有关确保库支持 ABI 的详细信息,请参阅为预构建库选择 ABI。
- 根据您是使用共享 (
.so
) 还是静态 (.a
) 库,添加PREBUILT_SHARED_LIBRARY
或PREBUILT_STATIC_LIBRARY
。
下面是一个小例子,其假设预构建库 libfoo.so
与描述它的 Android.mk
文件位于相同的目录中。
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := foo-prebuilt LOCAL_SRC_FILES := libfoo.so include $(PREBUILT_SHARED_LIBRARY)
在此示例中,模块名称与预构建库的名称相同。
构建系统将您的预构建共享库副本置于 $PROJECT/obj/local
中,将另一个副本和提取的调试信息置于 $PROJECT/libs/<abi>
中。 此处,$PROJECT
是您的项目的根目录。
从其他模块引用预构建库
如需从其他模块引用预构建库,则在与这些模块关联的 Android.mk
文件中,将该预构建库的名称指定为 LOCAL_STATIC_LIBRARIES
的值或 LOCAL_SHARED_LIBRARIES
变量。
例如,使用 libfoo.so
的模块说明可能类似于如下:
include $(CLEAR_VARS) LOCAL_MODULE := foo-user LOCAL_SRC_FILES := foo-user.c LOCAL_SHARED_LIBRARIES := foo-prebuilt include $(BUILD_SHARED_LIBRARY)
此处,LOCAL_MODULE
是引用预构建库的模块的名称;LOCAL_SHARED_LIBRARIES
是预构建库本身的名称。
导出预构建库的标头
foo-user.c
中的代码取决于通常位于使用预构建库分配的标头文件(如 foo.h
)中的特定声明。例如,foo-user.c
可能会有类似于如下的一行:
#include <foo.h>
在此情况下,当您构建 foo-user
模块时,您需要提供标头及其指向编译器的 include 路径。 完成此任务的一个简单方法是在预构建模块定义中使用导出。 例如,只要标头 foo.h
位于与预构建模块关联的 include
目录下,您就可以按如下方式声明它:
include $(CLEAR_VARS) LOCAL_MODULE := foo-prebuilt LOCAL_SRC_FILES := libfoo.so LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include include $(PREBUILT_SHARED_LIBRARY)
此处的 LOCAL_EXPORT_C_INCLUDES
定义确保构建系统导出指向预构建库的 include
目录的路径,针对依赖于它的模块将该路径附加到 LOCAL_C_INCLUDES
的值。
此操作让构建系统可以查找必需的标头。
调试预构建库
我们建议您提供包含调试符号的预构建共享库。NDK 构建系统始终从其安装到 $PROJECT/libs/<abi>/
的库版本提取符号,但您可以使用调试版本通过 ndk-gdb
进行调试。
为预构建库选择 ABI
您必须确保为您的目标 ABI 选择正确的预构建共享库版本。 Android.mk
文件中的 TARGET_ARCH_ABI
变量可以将构建系统指向相应的库版本。
例如,假设您的项目包含库 libfoo.so
的两个版本:
armeabi/libfoo.so x86/libfoo.so
以下代码段显示如何使用 TARGET_ARCH_ABI
,以便构建系统可选择相应的库版本:
include $(CLEAR_VARS) LOCAL_MODULE := foo-prebuilt LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libfoo.so LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include include $(PREBUILT_SHARED_LIBRARY)
如果您已指定 armeabi
作为 TARGET_ARCH_ABI
的值,则构建系统使用位于 armeabi
目录中的 libfoo.so
的版本。 如果您已指定 x86
作为 TARGET_ARCH_ABI
的值,则构建系统使用 x86
目录中的版本。