如何导入预建的 *.so 库并从新项目中调用它?

Han*_*lec 3 java java-native-interface android android-ndk .so

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

比方说:

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

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

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

Ale*_*ohn 5

最近,谷歌预发布了一项新功能,可以轻松重用预构建的本机库。如果您还没有准备好跳转到 Android Studio 4.0 和/或为libA构建必要的AAR,您可以使用旧方法。

\n\n

共有三种不同的轨道,具体取决于您的项目 B的性质。

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

  2. \n
  3. 如果第二个项目使用ndk-build,您应该include $(PREBUILT_SHARED_LIBRARY). NDK指南提供了更多最新详细信息。

  4. \n
  5. 如果项目使用CMake,则使用add_library(\xe2\x80\xa6 SHARED IMPORTED). Android Srudio文档解释了不同的场景。

  6. \n
\n\n

重要的是要强调ndk-buildCMake在处理预构建.so库方面的微小差异。虽然ndk-build会将这些库及其构建的所有库复制到安装目录,但CMake不提供此帮助。因此,您可能会将保存预构建库的文件夹添加到build.ghradlejniLibs.src中(如上面的情况 1 所示)。

\n\n

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

\n

  • @HangAlec:您不需要更改整个项目的包名称。只有具有在 **libA.so** 中实现的本机方法的类,才必须复制到 **项目 B** 并保持其“完全限定名称”完整。 (2认同)