Android Studio 中的多个本机模块

Multiple Native Modules in Android Studio

本文关键字:本机 模块 Studio Android      更新时间:2023-10-16

我有一个C++代码库,目前在Visual Studio中设置(在Windows上运行),有多个相互依赖的项目。我正在尝试将其带到Android Studio,使其在Android上运行。 我熟悉Visual Studio和C++,但对Android Studio的Gradle和CMake很陌生。

我(可能是错误的)期望是尝试像Visual Studio Solutions这样的Android Studio项目和像Visual Studio Projects这样的Android Studio Modules。鉴于我的代码库在Visual Studio中使用了多个项目,我正在尝试在Android Studio中创建多个模块 - 每个模块都有自己的build.gradleCMakeLists.txt文件。

问题是我无法让一段代码(AS 模块)与另一段代码链接。我正在使用add_library()STATIC编译这些不同的部分(我计划有一个模块来创建SHARED库,以加载到 Java 中)。

我可以通过include_directories("../OtherModule/src/")轻松获得包含的工作。但是,我无法将其链接。我找不到要链接到的 .so(或类似)文件(通过target_link_libraries()或等效文件)。当我从给定模块中提取 .arr 文件时,我没有看到任何 .so 或任何东西。

我意识到我可以简单地将整个代码库放在一个模块下(使用一个build.gradle和一个CMakeLists.txt- 或使用add_subdirectory()CMakeLists.txt网络)。我不知道这是否很好,或者是否需要更多/更少的时间来构建。

我敢肯定,可能有多种方法可以设置它,这可能只是一个偏好问题。到目前为止,我所做的所有研究都只发现严格地将本机代码添加到与Java代码相同的模块中 - 做基本的JNI本机桥接工作。我找不到一篇关于多个本机模块链接在一起的文章。

我希望在Android上有更多原生开发经验的人可以帮助我。谢谢!

TL;DR:简化的场景:(不关心JNI本机桥)我在Android Studio中有两个模块,都只有本机代码。我想让每个模块都有自己的build.gradleCMakeLists.txt,创建自己的STATIC库。一个模块依赖于另一个模块,必须设置正确的包含和链接目录。怎么做?!这是否正确(或者应该只有一个具有本机代码的模块)?

我在这里问了一个相关的问题。在我看来,AS...

  1. 。除非SHARED,否则实际上不会链接最终的模块库(它确实允许模块中的静态"子库");考虑共享最终库 - 不过,您必须专门在 Java 中System.loadLibrary()它。
  2. 。不允许您将文件安装到其他地方(例如,从本机模块安装到 Android 应用)。我通过set_target_properties( jniwrapper PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../libnative/build/intermediates/cmake/${BUILD_TYPE}/obj/${ANDROID_ABI}/libnative.so )获取库并在build.gradle中设置BUILD_TYPE来解决此问题。不过不太优雅。

总体而言,这似乎不是AS中鼓励的用例...