使用预编译库PREBUILT LIBRARY

使用预编译库

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 目录中的版本。

原文地址:https://www.cnblogs.com/gamesky/p/11369172.html

时间: 2024-10-10 21:52:48

使用预编译库PREBUILT LIBRARY的相关文章

NDK开发使用cMake方式 - 添加其他的预编译库

NDK 开发使用cMake方式,网上能找到不少的教程,这里推荐一篇博文: http://blog.csdn.net/wl9739/article/details/52607010 关于添加其他的预编译库,网上很多文章写得不太准确,这里说下步骤: 1,将预编译库加入项目 2,编辑CMakeLists.txt,动态链接库是SHARED,静态是STATIC. 关键是IMPORTED_LOCATION.CMAKE_SOURCE_DIR不用手动定义,指向CMakeLists.txt所在的目录. add_l

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

NDK里有个例子: android-ndk-r10/samples/module-exports/jni一看就懂了 ———————————————————————————– 从r5版本开始,就支持预编译的库(共享和静态). 也就是说在你的应用中,可包含和使用 预先编译的库. 这个功能的用处1. 你想分发你自己的库给第3方 NDK开发者,但不想把源码给他们2. 你想使用自己的预编译的库 来加速项目的Build过程. 声明一个预编译的库模块每个预编译的库,都必须声明为一个独立的模块 给ndk bui

ANPM-Apache_httpd-Nginx-PHP-MySQL 官方预编译包源(Pre-Built Packages Repository)收集

ANPM-Apache_httpd-Nginx-PHP-MySQL 官方预编译包源(Pre-Built Packages Repository)收集 Apache_httpd Nginx http://nginx.org/en/linux_packages.html echo '# [nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=0 enabled=1

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

1.和mysql扩展库的区别: (1   安全性.稳定性更高 (2  提供了面向对象和面向过程两种风格 2.php.ini  中的  extension=php_mysqli.dll 解除封印 3.面向对象:查询列表 1 <?php 2 3 //mysqli 操作数据(面向对象风格) 4 5 #1.创建Mysql对象 6 7 $mysqli=new MySQLi("127.0.0.1","root","daomul","test&

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

VLC的引用了很多开源的第三方库,均放到VLC目录下的contrib中(本来开始编译是2.1.x以上版本,以前或以后可能会变化),在Windows版本编译中,contrib文件夹中仅仅下载VLC官网上已经编译好的预编译包后解压到该目录下,要修改编译脚本(compile.sh和 contrib/src下的main.mak)为fetch所有第三方包中,下载后开始自动编译(由main.mak和contrib/src/***/rules.mak控制). 一旦编译通过,一般来说,在下一次执行VLC编译脚本

PHP-Mysqli扩展库的预编译

(1)预编译的好处 假如要执行100条类似的sql语句,每一次执行,在MySQL端都会进行一次编译,效率很低.提高效率的方法就是--减少编译的次数. 先制造一个sql语句的模板,在MySQL端预先编译好,之后每次只需要传递数据即可. 除了提高效率之外,预编译还可以防止sql注入. (2)dml语句的预编译 以向一个表中插入数据为例.表结构如下: +----------+----------------------------+| Field      | Type                

Windows 编译 Point Cloud Library 1.8.0

PCL(Point Cloud Library) 1.8.0 版本发布了,相对 1.7.x 版本,带来了大量的 更新,其源码可以从 pcl 1.8.0 release 下载.本文记录如何在 Windows 上使用 Visual Studio C++ 编译器编译和配置 PCL 1.8.0 版本. tl; dr 预编译好的 PCL 1.8.0 版本,包含了第三方程序库. 下载地址:Point Cloud Library 1.8.0 准备工作 首先确保安装了以下工具: Visual Studio Co

VS2005 MFC 预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)

当 Visual C++ 项目启用了预编译头 (Precompiled header) 功能时,如果项目中同时混合有 .c 和 .cpp 源文件,则可能收到 C1853 编译器错误:fatal error C1853: 'pjtname.pch' precompiled header file is from a previous version of the compiler, or the precompiled header is C++ and you are using it from

【转】预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)

用VC++ 2008 编写C语言程序,编译出现错误: 预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反) 解决方法: 建工程时 建立空项目 或者在项目设置里关闭预编译头的选项! 当 Visual C++ 项目启用了预编译头 (Precompiled header) 功能时,如果项目中同时混合有 .c 和 .cpp 源文件,则可能收到 C1853 编译器错误:fatal error C1853: 'pjtname.pch' precompiled header