【发布时间】:2015-03-26 10:26:48
【问题描述】:
我正在试验从 ubuntu 交叉编译的原生库。我真正想要的是能够编译我的 c++ 库并在 Xamarin.Android 应用程序中使用它们。
首先,我有 arm gcc 编译器:arm-linux-gnueabi-gcc。我有一个简单的库(libmr.so),它有一个函数void Print();,可以在控制台上打印一些东西。我正在编译:
arm-linux-gnueabi-gcc -Wall -shared -o libmr.so mr.c
当使用file libmr.so 检查它时,一切似乎都很好。但是,当我将它包含在我的 android 应用程序中并尝试加载它时,就好像它不存在一样。我确定它在那里,路径绝对正确,因为我尝试从同一个文件夹加载另一个库 (libmonodroid.so) 并且它有效。
我尝试检查两个库以发现某种差异:
$ objdump -x libmr.so | grep NEEDED
NEEDED libc.so.6
$ objdump -x libmonodroid.so | grep NEEDED
NEEDED libc.so
... (in addition to other libs)
这是我发现两者之间的唯一区别。 libmonodroid.so 正确加载,但 libmr.so 就像它不存在一样。 (我使用dlopen 来加载一个库)
编辑:
我使用相同的工具链构建了一个可执行文件,给了我一个线索:
- 与 libc 的静态链接:
arm-linux-gnueabi-gcc -Wall -o hi source.c -static。将hi推送到我的安卓设备并使用adb执行它。结果:成功! - 与 libc 的动态链接:
arm-linux-gnueabi-gcc -Wall -o hi source.c。结果:它甚至不存在!意思是./hi给出了/system/bin/sh: ./hi: not found,尽管它绝对存在。
那么,看起来 libc 真的是罪魁祸首?也许我需要动态链接不是libc.so.6,而是libc.so,就像libmonodroid.so 正在做的那样?
【问题讨论】:
-
使用 ndk 作为独立的工具链来构建你的 mr.c。 stackoverflow.com/a/5239573/1163019
-
@auselen 是的,我目前正在调查,看起来很有希望。将返回结果。
标签: android linux gcc shared-libraries