【问题标题】:How to Import a prebuilt *.so library and call it from the new project?如何导入预构建的 *.so 库并从新项目中调用它?
【发布时间】:2020-02-23 12:36:43
【问题描述】:

我目前正在开发一个将使用预构建共享库的项目。但是我对导入预建库以及从新项目 java 类调用预建库中的方法的过程感到很困惑。

假设:

  1. 项目 A 已为每个 ABI_ARCH 生成了 libA.so 文件。

  2. 我正在尝试在我的项目 B 中使用它们。

导入它们的正确方法是什么,以及如何调用在A中声明的libA.so的方法。换句话说,如何使用libA.so的公开API?

【问题讨论】:

    标签: java android android-ndk java-native-interface .so


    【解决方案1】:

    最近,Google 已经预先发布了 new feature,这将允许轻松重用预构建的本机库。如果您还没有准备好跳到 Android Studio 4.0,和/或为 libA 构建必要的 AAR,您可以使用旧方法。

    根据您的项目 B 的性质,共有三种不同的轨道。

    1. 如果它只从 Java/Kotlin 加载 libA.so,在 build.gradle 中指定 jniLibs.src 就足够了:How can I add .so files to an android library project using gradle 0.7+ 。请注意,所有具有在 libA.so 中实现的本机方法的类都必须复制到 Project B,并保持其完全限定名称不变。

    2. 如果第二个项目使用ndk-build,你应该include $(PREBUILT_SHARED_LIBRARY)。 NDK guide 有更多最新的详细信息。

    3. 如果项目使用 CMake,则使用 add_library(… SHARED IMPORTED)。 Android Srudio documentation 解释了不同的场景。

    重要的是要强调 ndk-buildCMake 在处理预构建的 .so 库方面的细微差别。虽然 ndk-build 会将这些库与它构建的所有库一起复制到安装目录,但 CMake 不提供此帮助。因此,您可能会将保存预建库的文件夹添加到 build.ghradle 中的jniLibs.src(如上面的案例 1)。

    在所有 3 种情况下,请确保您打包到 APK 或 AAB 中的库已去除调试符号。

    【讨论】:

    • 感谢您的回答,我尝试使用第一种方法,将 *.so 文件复制到 /main/jniLibs/ 并在 build.gradle 上添加 jnilibs.src,也使用 System.loadLibrary("A ") 加载 jniLib。当我尝试运行该应用程序时,它崩溃并显示错误“未找到 A 类”
    • 另外,在c++编译*.so文件时会出现上述错误;当 *.so 文件从 .c 编译时,错误是“No implementation found for long A.method(long)...”
    • 原来是包名不匹配,新项目必须有相同的包和类才能使用*.so文件。
    • @HangAlec:您不需要更改整个项目的包名。只有具有在 libA.so 中实现的本机方法的类,必须复制到 Project B,保持其完全限定名称不变。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多