使用预编译库

NDK 支持使用预编译库(同时支持静态库和共享库)。此功能有以下两个主要用例:

  • 向第三方 NDK 开发者分发您自己的库(而不分发您的源代码)。
  • 使用您自己的库的预编译版本来提升编译速度。

本页将介绍如何使用预编译库。

声明预编译库

您必须将自己使用的每个预编译库声明为一个独立模块。为此,请执行以下步骤:

  1. 为模块提供名称。此名称不需要与预编译库本身的名称相同。
  2. 在模块的 Android.mk 文件中,将指向您提供的预编译库的路径分配到 LOCAL_SRC_FILES。指定 LOCAL_PATH 变量的值的相对路径。

    注意:请务必选择与您的目标 ABI 对应的预编译库版本。要详细了解如何确保库支持 ABI,请参阅为预编译库选择 ABI

  3. 根据您使用的是共享库 (.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 目录中的版本。

使用预编译库PREBUILT LIBRARY官方说明的更多相关文章

  1. cocos 3.16 生成预编译库模板

    打开模板功能 不知道什么原因,cocos 3.16关闭了模板功能,因此使用cocos -h命令时,无法显示gen-templates参数. 打开的方式也挺简单,打开tools/cocos2d-cons ...

  2. Android Studio中通过CMake使用NDK并编译自定义库和添加预编译库

    Note:这篇文章是基于Android Studio 3.01版本的,NDK是R16. step1:创建一个包含C++的项目 其他默认就可以了. C++ Standard 指定编译库的环境,其中Too ...

  3. python 安装预编译库注意事项-pip

    一般安装依赖库用pip install 库名 就可以,某些情况下依赖的库需要安装预编译好的, 可以参考pip 安装时的错误信息 下面这个链接中可以直接下载 http://www.lfd.uci.edu ...

  4. android mk 预编译库

    LOCAL_PATH := $(call my-dir) #include $(CLEAR_VARS) # OpenCV #OPENCV_CAMERA_MODULES:=on #OPENCV_INST ...

  5. Android NDK引用预编译的动态链接库

    NDK里有个例子: android-ndk-r10/samples/module-exports/jni一看就懂了 ———————————————————————————– 从r5版本开始,就支持预编 ...

  6. PHP mysqli 扩展库(面向对象/数据库操作封装/事务控制/预编译)

    1.和mysql扩展库的区别: (1   安全性.稳定性更高 (2  提供了面向对象和面向过程两种风格 2.php.ini  中的  extension=php_mysqli.dll 解除封印 3.面 ...

  7. VLC 重新编译第三方库的预编译包contrib

    VLC的引用了很多开源的第三方库,均放到VLC目录下的contrib中(本来开始编译是2.1.x以上版本,以前或以后可能会变化),在Windows版本编译中,contrib文件夹中仅仅下载VLC官网上 ...

  8. 【VS工程设置】 编译动态库,命令行添加参数,不使用预编译头,指定该项目链接 哪种 运行库

    编译动态库 注意: 动态库: [目标文件扩展] => .dll + [配置类型] => 动态库(.dll) 静态库: [目标文件扩展] => .lib + [ 配置类型]=> ...

  9. 一个C++引用库的头文件预编译陷阱

    写在前面 老胡最近在工作中,有个场景需要使用一个第三方库,引用头文件,链接库,编译运行,一切都很正常,但是接下来就遇到了一个很诡异的问题,调用该库的中的一个对象方法为对象修改属性的时候,会影响到对象的 ...

随机推荐

  1. Web API接口安全了解

    2017版OWASP top 10 将API安全纳入其中,足以说明API被广泛使用且安全问题严重.自己尝试整理一下,但限于本人搬砖经验还不足.水平有限,本文只能算是抛砖引玉,希望大伙不吝赐教. 了解W ...

  2. Fundebug录屏插件更新至0.4.0,修复BUG,优化性能

    摘要: 录屏功能更加强大,欢迎免费试用! 关于Fundebug录屏功能 Fundebug是专业的程序BUG监控服务,当线上应用出现BUG的时候,我们可以第一时间报警,帮助开发者及时发现BUG,提高De ...

  3. 【Thinkphp】引入第三方类库常见问题

    TP3.2在添加第三方sdk的时候,文件放在ThinkPHP/Library/Org文件夹下可独立创建文件夹(官方文档有其他思路)需对文件做以下修改. 1.第一应该修改文件的名称(下载的sdk一般是 ...

  4. "轻"量级 Java Web 服务框架漫谈

    博文太长了, 还是先说下概要: 框架"轻量"与否可以从两方面来看待: 1) 框架本身的体量 - 例如小 jar 无依赖的苗条框架; 2) 用户使用框架是否获得各种便利而无阻隔(&q ...

  5. Linux服务管理之DHCP

    1.DHCP服务简介 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工作, 主要有两个用途:给内部网络或网络 ...

  6. centos服务器部署flask项目。

    已安装的环境nginx,python3,mysql,uwsgi,virtualenv 1,创建虚拟环境 virtualenv -p python3 myblog 2,进入虚拟环境 source myb ...

  7. PAT 乙级 1091.N-自守数 C++/Java

    题目来源 如果某个数 K 的平方乘以 N 以后,结果的末尾几位数等于 K,那么就称这个数为“N-自守数”.例如 3,而 2 的末尾两位正好是 9,所以 9 是一个 3-自守数. 本题就请你编写程序判断 ...

  8. JavaScript-前言

    目录 前言 前言 这是针对纯小白的Javascript教程. 有人问我,网页中流行的脚本语言是什么?这个时候我会简单粗暴的说:只有Javascript!对,只有Javascript.Javascrip ...

  9. opencv 程序

    IplImage结构中的一个元素:struct _IplROI *roi; //图像感兴趣区域,当该值非空时,只对该区域进行处理 .   ROI :Region of Interest,表示感兴趣的区 ...

  10. 201871010121-王方《面向对象程序设计(Java)》第四周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...