【问题标题】:How to link .a to .so and create new .so for android如何将 .a 链接到 .so 并为 android 创建新的 .so
【发布时间】: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 依赖项。

【问题讨论】:

    标签: android android-studio android-ndk


    【解决方案1】:

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

    1. 按以下顺序放置预建库:
    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
    
    1. 在您的项目中添加 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)
    
    1. 现在您可以在项目中使用它们了。所以:
    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 的东西?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    相关资源
    最近更新 更多