Android NDK开发详解之使用预构建库

Android NDK开发详解之使用预构建库

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 中,而将另一个提取的调试信息的副本放入 P R O J E C T / l i b s / < a b i > 中。此处, PROJECT/libs/<abi> 中。此处, 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// 的那个版本的库中删除这些符号,但您可以使用调试版本通过 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 目录中的版本。

相关推荐
我是谁??8 分钟前
C/C++使用AddressSanitizer检测内存错误
c语言·c++
让学习成为一种生活方式12 分钟前
R包下载太慢安装中止的解决策略-R语言003
java·数据库·r语言
晨曦_子画18 分钟前
编程语言之战:AI 之后的 Kotlin 与 Java
android·java·开发语言·人工智能·kotlin
大福是小强18 分钟前
005-Kotlin界面开发之程序猿初试Composable
kotlin·界面开发·桌面应用·compose·jetpack·可组合
孤客网络科技工作室40 分钟前
AJAX 全面教程:从基础到高级
android·ajax·okhttp
南宫生40 分钟前
贪心算法习题其三【力扣】【算法学习day.20】
java·数据结构·学习·算法·leetcode·贪心算法
发霉的闲鱼42 分钟前
MFC 重写了listControl类(类名为A),并把双击事件的处理函数定义在A中,主窗口如何接收表格是否被双击
c++·mfc
小c君tt44 分钟前
MFC中Excel的导入以及使用步骤
c++·excel·mfc
xiaoxiao涛1 小时前
协程6 --- HOOK
c++·协程
Heavydrink1 小时前
HTTP动词与状态码
java