I am attempting to use GRPC with Unity. I'm stuck compiling a libgrpc_csharp_ext.so
file which will successfully work with the arm-v7a
Android archetecture. I expected the following command to work from the GRPC repository root:
arm-linux-androideabi-gcc -I. -I./include -fPIC -o libgrpc_csharp_ext.o -c src/csharp/ext/grpc_csharp_ext.c
arm-linux-androideabi-gcc -I. -I./include -shared libgrpc_csharp_ext.o -o libgrpc_csharp_ext.so
I cobbled this together from this question. It compiles successfully and Unity recognizes the file when placed in /Plugins/Android
as a arvm7
library:
but when GRPC attempts to DllImport("grpc_csharp_ext")
on an actual Android device, I get an error:
Unable to load library '/data/app/PACKAGE/lib/arm/libgrpc_csharp_ext.so', native render plugin support disabled: java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "grpc_slice_from_copied_buffer" referenced by "/data/app/PACKAGE/lib/arm/libgrpc_csharp_ext.so"...
Followed by:
Unable to find grpc_csharp_ext
I know this is possible because this open-source project has successfully cross-compiled the necessary files. When I download the .so file from their project and drop it into mine it successfully loads, except it was compiled with a very old version of GRPC and I therefore do not wish to use it. Furthermore, I've already successfully created an .a file for iOS which works well with a similar strategy. When I check my file with file libgrpc_csharp_ext.so
I see that it is ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /system/bin/linker, with debug_info, not stripped
. This matches the type of the file obtained from the open-source repository.
It seems like the appropriate symbols are not included in the resulting .so
, based upon the error message above and also that the .so
is ~36kb, but the "correct" .so
from the open-source project is >5mb. I guess I'm compiling a dynamic library that doesn't include all the necessary symbols, but I'm not enough of a compiler guru to find the correct options.