从ubuntu linux目标arm(android)编译的本机库交叉编译

时间:2015-03-26 10:26:49

标签: android linux gcc shared-libraries

我正在尝试从ubuntu交叉编译的本机库。我真正想要的是能够编译我的c ++库并在Xamarin.Android应用程序中使用它们。

首先,我有arm gcc编译器:arm-linux-gnueabi-gcc。我有一个简单的lib(libmr.so),它有一个函数void Print();,可以向控制台输出内容。我正在编译:

arm-linux-gnueabi-gcc -Wall -shared -o libmr.so mr.c

使用file libmr.so进行检查时,一切似乎都很好。但是,当我将其与我的Android应用程序包含在一起并尝试加载它时,就好像它不存在一样。我确定它在那里,路径绝对正确,因为我试图从同一个文件夹加载另一个lib(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加载lib)

修改

我使用相同的工具链构建了一个可执行文件,给了我一个线索:

  • 与libc进行静态链接:arm-linux-gnueabi-gcc -Wall -o hi source.c -static。将hi推送到我的Android设备并使用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一样?

1 个答案:

答案 0 :(得分:0)

检查this是否有任何有同样问题的人。下载ndk,有一个独立的工具链,用于构建在Android上运行的可以提取的本机库(你不需要整个ndk)。