【问题标题】:Issue including executable with Android application when using Jelly Bean使用 Jelly Bean 时出现问题,包括 Android 应用程序的可执行文件
【发布时间】:2012-11-20 06:48:53
【问题描述】:

我已将一些有用的免费/开源工具移植到 Android。一个是 Octave,另一个是 gnuplot。他们齐心协力,免费(如语音)和免费(如啤酒)提供类似 Matlab 的功能。我以一种有趣的方式将它们打包在应用程序中。具体来说,

1) 我在 libs/armeabi 目录中包含可执行库和共享库。由于 android 命名约定,必须给他们取一个有趣的名字。

2) 我创建目录bin/ 和mylib/。我授予他们全部权限。

3) 我创建了从bin/ 到解压后的lib/ 目录中的可执行文件的链接。我给他们正确的名字和完整的权限。

4) 我创建了从mylib/ 到解压后的lib/ 目录中的共享库的链接。我给他们正确的名字和完整的权限。

5) 然后我使用ld-linux.so.3(现在位于mylib/ 目录中的库之一)和--library-path 选项指向mylib/ 目录以从Android 终端模拟器启动可执行文件。

Octave 在所有版本的 Android 中都能完美运行,但当我尝试在仅运行 Jelly Bean 时启动它时,gnuplot 会出现此错误:

error while loading shared libraries: gnuplot: failed to map segment 
from shared object: Operation not permitted.

那么,为什么这两个可执行文件之一以相同的方式出现此错误?为什么只在果冻豆中?另外,在 JB 上,如果我让自己成为超级用户,一切都会再次起作用。

关于如何调试的任何想法?我已经确认所有文件都在那里,并且拥有我希望它们拥有的权限。

请帮忙。如果你这样做,你将帮助一个免费、开源、教育和有用的应用程序。

【问题讨论】:

  • 试着用不同的方式解释它,也许更好,在这里:stackoverflow.com/questions/13502156/…
  • 我不知道这是否有效,但您可以尝试在您认为发生此错误的特定行上使用“console.writeline”和/或“Log.d”重新编译 gnuplot 库并写出一些信息。
  • 查看 JellyBean 源代码,我看到字符串“无法从共享对象映射段”嵌入二进制 prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7- 4.6/sysroot/usr/lib/ld-2.7.so 。有谁知道如何找到构建的确切来源?阅读源代码可以提供线索。它是否存储在android源站点的某个地方?我找不到它。
  • Android 的独特 ld 是仿生 libc 源的一部分。但是为什么要在 Android 设备上使用 ld-linux 需要解释一下!
  • 做 Log.d 或 console.writeline 没有帮助。似乎没有一行 gnuplot 正在执行。它似乎是 ld-linux 或它调用的东西来帮助它似乎不喜欢二进制文件的构建方式。

标签: android permissions cross-compiling android-4.2-jelly-bean


【解决方案1】:

问题在于如何编译可执行文件。它们需要使用正确支持较新 arm 设备的交叉编译器进行编译。我使用的编译器生成的可执行文件只能在 arm 设备的子集上运行。问题不在于不同版本的 android。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    相关资源
    最近更新 更多