5

我得到了一个共享对象文件 (.so) 和其中的函数,但我不知道如何使用它,或者更改它以在 iOS 应用程序中使用。有人能指出我正确的方向吗?

我知道 .so 来自 Android 应用程序,但有人告诉我我也可以让它在 iOS 应用程序中工作。

4

2 回答 2

9

实际上,从技术上讲,是的,你可以,但不是你想的那样。

如果它来自 Android,它可能是为 ARM 编译的。所以它应该与 iOS 设备中的 ARM CPU 二进制兼容。但是,iOS 并没有使用通常的共享对象格式(即 ELF 格式),而是 iOS 和 OS X 自己的 Mach-O 格式。

这意味着您不能直接链接到此共享对象文件,也不能将其直接传递给dlopen()and dlsym()。您必须进行认真的黑客攻击(您可能不知道)。这涉及正确加载和重新定位文件。

这方面的一个例子可以在 iOS 越狱开发者和黑客Comex 的 GitHub 存储库 Frash中找到,这是一个用于越狱 iOS 设备的 Flash 播放器。Comex 实质上为 iOS 编写了一个 ELF 加载器模块(称为“食物”),并使用它使 Android 的 libflashplayer.so 在 iOS 上运行。很整洁吧?

另请注意,这对于 AppStore 应用程序来说是不可能的,因为它需要动态加载和操作系统中的各种更改。

于 2012-11-28T23:09:35.123 回答
4

虽然在技术上可行(见 h2co3 的回答),但对于任何实际情况,答案是否定的

  • 所以文件不是正确的二进制格式
  • 即使是这样,appstore 也不允许动态加载
于 2012-11-28T23:49:09.773 回答