使用NDK for Android编译GRPC的CSharp扩展

会挽雕弓如满月,西北望,射天狼。这篇文章主要讲述使用NDK for Android编译GRPC的CSharp扩展相关的知识,希望能为你提供帮助。
我试图在Unity中使用GRPC。我被困在编译一个libgrpc_csharp_ext.so文件,它将成功地与arm-v7a android archetecture一起使用。我希望以下命令可以从GRPC存储库根目录开始:

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

我从this question拼凑了这个。它成功编译并且Unity在/Plugins/Android中作为arvm7库识别该文件:
使用NDK for Android编译GRPC的CSharp扩展

文章图片

但是当GRPC尝试在实际的Android设备上使用DllImport("grpc_csharp_ext")时,我收到一个错误:
无法加载库'/data/app/PACKAGE/lib/arm/libgrpc_csharp_ext.so',禁用本机渲染插件支持:java.lang.UnsatisfiedLinkError:dlopen失败:无法找到“/ data / app /”引用的符号“grpc_slice_from_copied_buffer”包装/ lib中/ ARM / libgrpc_csharp_ext.so” ......
其次是:
Unable to find grpc_csharp_ext
我知道这是可能的,因为this开源项目已成功交叉编译了必要的文件。当我从他们的项目下载.so文件并将其放入我的it successfully loads时,除了它是用一个非常旧版本的GRPC编译,因此我不想使用它。此外,我已经使用了类似策略的successfully created an .a file for iOS。当我用file libgrpc_csharp_ext.so检查我的文件时,我发现它是ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /system/bin/linker, with debug_info, not stripped。这与从开源存储库获取的文件类型相匹配。
根据上面的错误信息以及.so是~36kb,似乎相应的符号不包含在生成的.so中,但来自开源项目的“正确”.so> 5mb。我想我正在编译一个不包含所有必要符号的动态库,但我不足以找到正确的选项。
答案感谢GRPC团队的帮助,我有一个有效的解决方案; 请参阅我在这里的问题评论:https://github.com/grpc/grpc/issues/14402#issuecomment-369942250
【使用NDK for Android编译GRPC的CSharp扩展】我正在与他们合作,希望能将这些融入主人。与此同时,我将尝试使用每个平台(不仅仅是Android)的说明更新此博客文章:http://examinedself.com/cross-compile-grpc-unity/

    推荐阅读