会挽雕弓如满月,西北望,射天狼。这篇文章主要讲述使用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
库识别该文件:文章图片
但是当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/
推荐阅读
- Android Studio 3.0.1不会构建NDK静态库
- 你如何在android项目(gradle)中包含'com.google.protobuf'作为完整但不是精简版()
- C ++读取内部Android NDK文件
- Android Studio中的Gstreamer示例
- 使用OpenCV和Android NDK转换数据格式
- 错误(在Android ndk中使用C的冲突类型)
- Android java.lang.UnsatisfiedLinkError dalvik.system.PathClassLoader
- 使用__android_log_print打印Opencv Mat,Android NDK的内容
- Android JNI - 线程同步