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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用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库识别该文件:

enter image description here

但是当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

我正在与他们合作,希望能将这些融入主人。与此同时,我将尝试使用每个平台(不仅仅是Android)的说明更新此博客文章:http://examinedself.com/cross-compile-grpc-unity/

以上是关于使用NDK for Android编译GRPC的CSharp扩展的主要内容,如果未能解决你的问题,请参考以下文章

NDk编译opencv for Android,并引用在Unity3d游戏中的一般步骤

如何确定 C 代码是为 Android/NDK 还是 iOS 编译的

如何用Android NDK编译FFmpeg

android开发,怎么使用ndk编译成.so文件

Mac 编译 XGBoost for Android

如何使用android的ndk编译器 编译c++的库