android - 从 ubuntu linux 目标 arm (android) 交叉编译的 native 库

标签 android linux gcc shared-libraries

我正在试验从 ubuntu 交叉编译的 native 库。我真正想要的是能够编译我的 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 推送到我的 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 正在做的那样?

最佳答案

检查 this对于任何有同样问题的人。下载 ndk,有一个独立的工具链,用于构建在 android 上运行的 native 库,您可以提取它(您不需要整个 ndk)。

关于android - 从 ubuntu linux 目标 arm (android) 交叉编译的 native 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29276139/

相关文章:

c - 合并多个 .so 共享库

android - Canvas : Trying to use a recycled bitmap error

java - OSMDroid Bonus Pack - gradle.build 错误 - 无法解决依赖关系

linux - 如何完全更改每个 Hadoop DataNode 上的底层磁盘?

c - -pie 究竟做了什么?

java - 闲置仪表

c - SDL_QUIT 事件适用于 g++ 但不适用于 gcc

android - Android 上的 Facebook SDK

java - Android Java ServerSocket 端口号不是它应该的

c++11 - 如何使用 std::shared_ptr 实现多态性?