如何将 .a 链接到 .so 并为 android 创建新的 .so

Posted

技术标签:

【中文标题】如何将 .a 链接到 .so 并为 android 创建新的 .so【英文标题】:How to link .a to .so and create new .so for android 【发布时间】:2021-01-31 12:37:31 【问题描述】:

我有一个现有的 android 项目,其中一个 .so(比如existing.so)被打包并加载到一些.aar(比如existing.aar)中。现有的.so 文件暴露了我的 .a (my.a) 静态库将使用的符号(函数)。如何在该特定项目中包含 my.a 文件,以便获得指向 existing.so 的链接?是否应该将新的 .so 链接到 my.a 和 existing.so ?我可以在该现有项目中添加 cmake 或 ndk 依赖项。

【问题讨论】:

【参考方案1】:

如果原生预建库是通过 .aar 预制件提供的,这里有来自 Android 开发人员的link 说明如何操作,如果没有,您需要像处理普通 CMake 项目一样进行操作:

    按以下顺序放置预建库:
libs/$ANDROID_PLATFORM/$ANDROID_ABI/existing
libs/$ANDROID_PLATFORM/$ANDROID_ABI/my

例如:

libs/android-28/x86_64/existing/lib/existing.so
libs/android-28/x86_64/existing/include/existing.h
libs/android-28/x86_64/my/lib/my.a
libs/android-28/x86_64/my/include/my.h
    在您的项目中添加 APPEND CMAKE_FIND_ROOT_PATH 的路径。所以:
list(APPEND CMAKE_FIND_ROOT_PATH libs/$ANDROID_PLATFORM/$ANDROID_ABI/existing)
list(APPEND CMAKE_FIND_ROOT_PATH libs/$ANDROID_PLATFORM/$ANDROID_ABI/my)
    现在您可以在项目中使用它们了。所以:
find_library(existing_lib existing)
find_library(my_lib my)

add_library(project SHARED <source_files>)
target_link_libraries(project existing_lib my_lib)

【讨论】:

我需要将existing.so复制到libs文件夹吗?实际上,它已经在某些 .aar 中作为第三方库打包。如何为此添加依赖项? 我猜是的,如果你想在 CMake 文件的 .aar 之外使用它。您还需要提供相应的头文件,因为据我所知,.aar 不会这样做。 我喜欢你的回答? 有没有办法可以将 .aar/.apk 中已经存在的 .so 的依赖项添加到 cmake 中? 深入挖掘,我发现可以通过使用 Prefab 功能直接从 .aar 包中使用本机库:developer.android.com/studio/build/… 你的 .aar 是否包含 Prefab 的东西?

以上是关于如何将 .a 链接到 .so 并为 android 创建新的 .so的主要内容,如果未能解决你的问题,请参考以下文章

如何链接到 libabc.a 而不是 libabc.so?

如何使用Android调用百度地图API

Android NDK编译如何强制使用libc++.a的静态链接库

如何将共享库链接到Linux中的其他共享库?

gcc默认链接到libc.a或libc.so吗?

Android怎么调用第三方SO动态链接库