Android Studio中的多个原生模块

时间:2017-01-21 21:43:32

标签: android c++ android-studio cmake native

我有一个C ++代码库,目前在Visual Studio中设置(在Windows上运行),具有多个具有相互依赖关系的项目。我试图将其转移到Android Studio,以使其在Android上运行。 我熟悉Visual Studio和C ++,但对Android Studio的Gradle和CMake来说还是一个新手。

我的(可能是错误的)期望是尝试处理像Visual Studio Solutions这样的Android Studio项目,以及像Visual Studio Projects这样的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的网络使用{{1 }})。我不知道这是否正常,或者是否需要更多/更少的时间来构建。

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

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

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

1 个答案:

答案 0 :(得分:1)

我问了一个相关的问题here。在我看来,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.gradle中设置BUILD_TYPE来解决此问题。虽然不过分优雅。
  3. 总的来说,这似乎不是AS中鼓励的用例...