NDK编译——使用预构建库

文章的内容是从Android开发者官网扒的,为了防止再登不上去,记录一下。官网网址:https://developer.android.com/ndk/guides/prebuilts.html


使用预构建库

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
NDK是Android Native Development Kit的缩写,它是一套专门为Android平台提供的用于开发底层C/C++代码的工具集。使用NDK可以实现直接在Android上编译C/C++的动态。而x265是一种现代化的视频编码技术,它可以在保证视频质量的基础上压缩视频大小。 使用NDK直接编译x265的动态需要以下步骤: 1. 下载并安装NDK,并将其添加到环境变量中。 2. 下载x265源码,并解压到本地路径。 3. 打开终端窗口,进入x265源码路径,执行以下命令: ``` $ export NDK_ROOT=/path/to/ndk $ export PATH=$NDK_ROOT:$PATH $ export SYSROOT=$NDK_ROOT/platforms/android-xx/arch-arm64/ $ export CC=$NDK_ROOT/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-gcc $ export CXX=$NDK_ROOT/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-g++ $ export LD=$NDK_ROOT/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-ld $ export AR=$NDK_ROOT/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-ar $ export AS=$NDK_ROOT/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-as $ export RANLIB=$NDK_ROOT/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-ranlib ``` 其中,将`/path/to/ndk`替换成NDK的安装路径,将`android-xx`替换成对应的Android API版本。 4. 执行以下命令进行编译: ``` $ ./configure --disable-asm --prefix=/path/to/output --host=aarch64-linux-android $ make -j4 $ make install ``` 其中,将`/path/to/output`替换成自己想要输出的路径。 5. 编译完成后,可以将输出的动态文件拷贝到Android项目中,并在项目中调用该文件。 通过以上步骤,就可以在Android平台上使用NDK直接编译x265的动态了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值