使用预编译库PREBUILT LIBRARY官方说明
使用预编译库
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
目录中的版本。
使用预编译库PREBUILT LIBRARY官方说明的更多相关文章
- cocos 3.16 生成预编译库模板
打开模板功能 不知道什么原因,cocos 3.16关闭了模板功能,因此使用cocos -h命令时,无法显示gen-templates参数. 打开的方式也挺简单,打开tools/cocos2d-cons ...
- Android Studio中通过CMake使用NDK并编译自定义库和添加预编译库
Note:这篇文章是基于Android Studio 3.01版本的,NDK是R16. step1:创建一个包含C++的项目 其他默认就可以了. C++ Standard 指定编译库的环境,其中Too ...
- python 安装预编译库注意事项-pip
一般安装依赖库用pip install 库名 就可以,某些情况下依赖的库需要安装预编译好的, 可以参考pip 安装时的错误信息 下面这个链接中可以直接下载 http://www.lfd.uci.edu ...
- android mk 预编译库
LOCAL_PATH := $(call my-dir) #include $(CLEAR_VARS) # OpenCV #OPENCV_CAMERA_MODULES:=on #OPENCV_INST ...
- Android NDK引用预编译的动态链接库
NDK里有个例子: android-ndk-r10/samples/module-exports/jni一看就懂了 ———————————————————————————– 从r5版本开始,就支持预编 ...
- PHP mysqli 扩展库(面向对象/数据库操作封装/事务控制/预编译)
1.和mysql扩展库的区别: (1 安全性.稳定性更高 (2 提供了面向对象和面向过程两种风格 2.php.ini 中的 extension=php_mysqli.dll 解除封印 3.面 ...
- VLC 重新编译第三方库的预编译包contrib
VLC的引用了很多开源的第三方库,均放到VLC目录下的contrib中(本来开始编译是2.1.x以上版本,以前或以后可能会变化),在Windows版本编译中,contrib文件夹中仅仅下载VLC官网上 ...
- 【VS工程设置】 编译动态库,命令行添加参数,不使用预编译头,指定该项目链接 哪种 运行库
编译动态库 注意: 动态库: [目标文件扩展] => .dll + [配置类型] => 动态库(.dll) 静态库: [目标文件扩展] => .lib + [ 配置类型]=> ...
- 一个C++引用库的头文件预编译陷阱
写在前面 老胡最近在工作中,有个场景需要使用一个第三方库,引用头文件,链接库,编译运行,一切都很正常,但是接下来就遇到了一个很诡异的问题,调用该库的中的一个对象方法为对象修改属性的时候,会影响到对象的 ...
随机推荐
- ssh免密登录(公钥私钥)指令
1.在.ssh目录中执行ssh-keygen -t rsa命令生成两个秘钥,公钥(id_rsa.pub)和私钥(id_rsa) 2.ssh-copy-id -i id_rsa.pub 对方用户名@对方 ...
- 《linux就该这么学》课堂笔记15 vsftpd文件传输、Samba/NFS文件共享
1.为了能够在如此复杂多样的设备之间(Windows.Linux.UNIX.Mac等不同的操作系统)解决问题解决文件传输问题,文件传输协议(FTP)应运而生. FTP服务器是按照FTP协议在互联网上提 ...
- 前后端分离-Restful最佳实践
前后端分离-Restful最佳实践 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- shell 脚本中 while 只执行一次
实例代码 while read line ; do ssh -p20002 $line -o StrictHostKeyChecking=no xxxxxxxxx done < ip.txt w ...
- 设置 Jupyter notebook 工作空间 / 默认路径
常用的启动 Jupyter notebook 的两种方式是:命令行窗口启动和开始菜单启动.设置 Jupyter notebook 的默认路径也有两种常用方式: 修改配置文件 设置快捷方式. 1 通过修 ...
- RF元素定位的例子
Execute Javascript $("input[type='button']").click() Comment Click Button css=input.login_ ...
- Scrapy笔记12- 抓取动态网站
Scrapy笔记12- 抓取动态网站 前面我们介绍的都是去抓取静态的网站页面,也就是说我们打开某个链接,它的内容全部呈现出来. 但是如今的互联网大部分的web页面都是动态的,经常逛的网站例如京东.淘宝 ...
- ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于(WIFI模块AT指令TCP透传方式),定时访问升级
前言 学习此代码所需: 实现功能概要 定时使用http访问云端的程序版本,如果版本不一致,然后通过http下载最新的升级文件,实现升级. 测试准备工作(默认访问我的服务器,改为自己的服务器,请看后面说 ...
- django -- 安装django
安装 通过cmd进行安装 pip3 install django==1.11.11 创建django项目 通过命令行进行创建 下面的命令创建了一个名为"mydjango"的Djan ...
- 洛谷 P2661 信息传递(NOIP 提高 2015)
传送门 本题本来是一个很好的并查集的题(似乎靠的就是并查集),然而蒟蒻我刚刚学习了 tarjan 所以就用 terjan做了一下 大概题意就是:一个人要和另外的一个人告诉他所知道的信息,然后问什么时候 ...