roc-java icon indicating copy to clipboard operation
roc-java copied to clipboard

Eliminate libc++_shared.so dependency on Android?

Open gavv opened this issue 5 years ago • 4 comments

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?

gavv avatar Jun 04 '20 07:06 gavv

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.

MatteoArella avatar Jun 05 '20 14:06 MatteoArella

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?

MatteoArella avatar Jun 27 '20 14:06 MatteoArella

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.

gavv avatar Jun 27 '20 14:06 gavv

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

gavv avatar Apr 06 '23 08:04 gavv