Android Studio 中的多个原生模块

Cau*_*loy 6 c++ android native cmake android-studio

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

我(可能是错误的)期望是尝试处理像 Visual Studio 解决方案这样的 Android Studio 项目和像 Visual Studio 项目这样的 Android Studio 模块。鉴于我的代码库在 Visual Studio 中使用多个项目,我试图在 Android Studio 中创建多个模块——每个模块都有自己的build.gradleCMakeLists.txt文件。

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

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

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

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

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

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

Fim*_*ena 1

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

  1. ...实际上并不链接最终的模块库,除非它是SHARED(它确实允许模块内有静态“子库”);考虑使最终的库共享 -System.loadLibrary()不过,您将不得不在 Java 中专门使用它。
  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_TYPE在 build.gradle 中进行设置来解决这个问题。但并不过分优雅。

总的来说,这似乎不是 AS 中值得鼓励的用例......