I have a C++ codebase that is currently set up in Visual Studio (to run on Windows), with multiple Projects with inter-dependencies. I'm trying to bring it over to Android Studio, to get it running on Android. I'm familiar with Visual Studio and C++, but quite new to Android Studio's Gradle and CMake.
My (possibly wrong) expectation is to try and treat Android Studio Projects like Visual Studio Solutions, and Android Studio Modules like Visual Studio Projects. Given that my codebase uses multiple Projects in Visual Studio, I am trying to create multiple Modules in Android Studio -- each one with their own build.gradle
and CMakeLists.txt
files.
The issue is that I cannot get one section of code (AS Module) to link with the other. I am compiling these different sections as STATIC
using add_library()
(I plan to have one Module that creates a SHARED
library, to load into Java).
I can easily get the includes to work via include_directories("../OtherModule/src/")
. However, I cannot get it to link. I cannot find the .so (or similar) file to link to (via target_link_libraries()
or equivalent). When I extract the .arr file from a given Module, I do not see any .so or anything.
I realize that I could simply put the entire codebase under one Module (using one build.gradle
and one CMakeLists.txt
-- or network of CMakeLists.txt
's using add_subdirectory()
). I don't know if this is fine, or if it would take more/less time to build.
I'm sure that there could be multiple ways to set this up, and it could just be a matter of preference. All research that I've done thus far has only found strictly adding native code to the same module with Java code -- doing basic JNI native bridge stuff. I haven't been able to find a single article about multiple native Modules linking together.
I'm hoping that someone with more experience with native development on Android could help me out. Thanks!
TL;DR: Simplified scenario: (Without being concerned with the JNI native bridge) I have two Modules in Android Studio, both with only native code. I would like to have each Module have its own build.gradle
and CMakeLists.txt
, creating its own STATIC
libraries. One Module depends on the other and must set the correct include and link directories. How do?! Is this even correct (or should there ever be only one Module with native code)?
I asked a related question here. It seems to me that AS...
SHARED
(it does allow static 'sub-libraries' within the module); consider making the final library shared - you will have toSystem.loadLibrary()
it specifically in Java though.set_target_properties( jniwrapper PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../libnative/build/intermediates/cmake/${BUILD_TYPE}/obj/${ANDROID_ABI}/libnative.so )
and settingBUILD_TYPE
in build.gradle. Not overly elegant though.Overall, this does not seem to be an encouraged use-case in AS...