android 怎么引用一个静态库

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android 怎么引用一个静态库相关的知识,希望对你有一定的参考价值。

参考技术A

由于工作需要,需要在framework中增加自己的动态库,并且动态库需要使用合作方提供的第三方静态库。但是在引入静态库编译动态库时总是提示失败。具体如下:

1. 文件列表

说明: android.mk是编译配置文件,test.cpp是编译动态库的源文件,内容很简单,就是一个函数里面分别调用静态库中的函数。本例的主要目的是验证动态库引用第三方库的方法,具体库函数的功能基本忽略。 third_lib.a是第三方静态库文件; third_lib.h是第三方静态库输出函数的头文件

2.可以通过命令 mn -s third_lib.a来查看静态库的大致情况:


3.可以看出,静态库的源文件也叫test, 它提供了两个函数xdcodec_encode1和xdcodec_encode_init1。

4.再来看一下编译配置文件的内容:

可以看出这个配置文件的内容主要分为两部分,第一部分预编译静态库,这一过程不触发构建过程,仅仅是重起了个名字,并且将该库拷贝到某个路径下(具体可以参看另一篇文章,NDK使用二进制库的方法);第二部分是用于编译动态本地库,可以看出它通过LOCAL_STATIC_LIBRARIES关键字引入了之前预编译的静态库。

参考技术B 关于编译静态库:
android.mk和xxx.cpp放在新文件夹里:
LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \xxx.cpp
LOCAL_MODULE:= libx
include $(BUILD_STATIC_LIBRARY)
生成静态库libx.a文件

Android NDK 中的静态库交叉依赖

【中文标题】Android NDK 中的静态库交叉依赖【英文标题】:Static library cross-dependencies in Android NDK 【发布时间】:2014-04-01 15:48:41 【问题描述】:

我正在开发一个使用大量静态库的 Android NDK 应用程序。其中一些静态库相互依赖(或特别是头文件),但没有循环引用。在依赖库的 Android.mk 文件中,我原以为我可以使用

$(调用导入模块,#name)

... 从一个静态库到另一个,但它似乎不起作用,因为我在编译时缺少头文件错误。到目前为止,我已经通过将依赖项“include”目录手动添加到 LOCAL_C_INCLUDES 变量来解决这个问题,但是在其他模块的相对路径上下运行感觉有点混乱。

似乎必须有更好的方法来做到这一点。我知道 LOCAL_EXPORT_C_INCLUDES 在从我的主共享库(由 NativeActivity 加载的库)中引用静态库时确实有效,但它似乎在静态库和静态库之间不起作用。

我只是以某种方式设置错误吗?这些模块是否应该能够相互导入并自动获取包含?

【问题讨论】:

【参考方案1】:

似乎除了导入依赖模块之外,我还需要将依赖模块添加到依赖 Android.mk 的 LOCAL_STATIC_LIBRARIES 变量中。我曾假设静态库列表仅用于链接代码,但它显然也会影响标头导出。

【讨论】:

以上是关于android 怎么引用一个静态库的主要内容,如果未能解决你的问题,请参考以下文章

如何在android studio中用JNI调用静态库

静态库的未定义引用和奇怪的内容

Android NDK 中的静态库交叉依赖

求问vs2013怎么添加静态库,试了两种方法都有问题

android ndk-build 编译静态库libxx.a 以及Android studio openssl 静态库配置(cmake)

NDK下如何使用第三方静态库?