Recently, I ported my existing Android project from an ancient Gradle version to Gradle 6.6 and Android Studio's Gradle plugin 4.0.1. This project uses an external native library (.so file) that gets used in the Java code via JNI. This .so library has a dependency on libc++_shared.so
because it is written in C++.
I realized that if I just copy the .so file into the corresponding platform folder (arm64-v8a
, armeabi-v7a
, x86
, x86_64
) within the jniLibs
Gradle packages it "properly" into my .apk file.
By "properly" I mean that it automatically adds libc++_shared.so
, which my library has a dependency on, as well as my own library to the .apk file. In addition, if I additionally set jniDebuggable
to true
in the build.gradle
file it will also add the gdbserver
library which is required to be able to attach the native code debugger.
Now, this is exactly what I want. The problem is that I cannot find any documentation that describes this behavior. The best source I could find is this but it does not mention anything about dependencies being packaged automatically. So, I don't know whether that is an officially supported way of doing things.
I suspect that there is a part of Android's Gradle based build process that automatically analyzes the files in the jniLibs
folder and acts accordingly. It would be great to know a bit more to be aware what is really going on.
Does anyone have a reference that confirms my above observations or know which Gradle task (or whatever) accomplishes this? It would also be good to know in which Android Gradle plugin version this behavior was introduced.
Edit:
This answer to another SO question led me to the Android source file https://android.googlesource.com/platform/tools/build/+/master/builder/src/main/java/com/android/builder/internal/packaging/Packager.java
which seems to be the code that packages the .so files and gdbserver
into the .apk file. But I have no explanation why libc++_shared.so
gets packaged as well.