Eliminate libc++_shared.so dependency on Android?
On Android, if AAR or APK has native libraries depending on libc++_shared.so (C++ STL from Clang), they should ship a copy of the library.
This, theoretically, may lead to problems if the user wants to use more than one native library and they depend on different versions of libc++_shared.so. It seems that the official recommendation is not use more than one native library.
In our case, both libroc.so and libroc_jni.so depend on libc++_shared.so. Here are the dependencies of libroc.so:
$ aarch64-linux-android-readelf -d ./libroc.so | grep NEEDED
0x0000000000000001 (NEEDED) Shared library: [libc++_shared.so]
0x0000000000000001 (NEEDED) Shared library: [libm.so]
0x0000000000000001 (NEEDED) Shared library: [libdl.so]
0x0000000000000001 (NEEDED) Shared library: [libc.so]
Here, libc++_shared.so is the only library needed to be shipped. Other libraries, AFAIK, are guaranteed to be available on every Android system.
But actually, I think we could get rid of the dependency on libc++_shared.so:
-
For libroc.so, we can link it statically into libroc.so or maybe even don't use it on Android at all (Roc does not use much of STL).
-
For libroc_jni.so, we can actually don't use C++. It seems that most files can be just renamed from .cpp to .c. It seems that the only C++ feature we're using is std::mutex. We can replace it with pthread_mutex for now (and add non-unix implementation later when needed), or maybe we can somehow move synchronization from C++ side to Java side.
#55
@MatteoArella Thoughts?
Yes I agree with that problem on libc++_shared.so.
We could link it statically into libroc.so and remove that dependency on libroc_jni.so;
regarding synchronization we can use directly pthread_mutex in my opinion.
For android library we can remove STL dependency with -DANDROID_STL=none arguments on android gradle plugin;
regarding libroc.so can we set LDFLAGS=-static-libstdc++ before compiling with scons or do you have a different approach?
regarding libroc.so can we set LDFLAGS=-static-libstdc++ before compiling with scons or do you have a different approach?
I didn't try it yet. If LDFLAGS will work well, let's start with it. Later we can add a scons option to enable static-libstdc++ or disable libstdc++ at all.
IIRC Android docs claim that static-libstdc++ is dangerous (i.e. is not guaranteed to work in all cases), so we should carefully test it.
For libroc_jni.so, we can actually don't use C++. It seems that most files can be just renamed from .cpp to .c. It seems that the only C++ feature we're using is std::mutex. We can replace it with pthread_mutex for now (and add non-unix implementation later when needed), or maybe we can somehow move synchronization from C++ side to Java side.
The quoted part part is done in #55.
The remaining part for this issue is to adjust build script for Android to build libroc with static libc++, as suggested in https://github.com/roc-streaming/roc-java/issues/17#issuecomment-650570471
The build script to be modified is here: https://github.com/roc-streaming/roc-java/blob/main/scripts/android/build_roc.sh