【问题标题】:Android NDK built library crahes on devices but runs fine in emulatorAndroid NDK 构建库在设备上崩溃但在模拟器中运行良好
【发布时间】:2020-04-26 14:27:49
【问题描述】:

我想通过本机代码进行 DSP 计算。这在模拟器(Android 4.2.2)中运行良好。但在一些设备(Android 7 和 9)上,由 NDK 构建的库让应用程序在执行 System.loadLibrary 时直接崩溃。 但是:当我将下载的库放入我的 APK 时,它会毫无问题地加载。

我承认,对于主要应用程序,我在 Windows 上使用旧的 Eclipse IDE,目标是 API 26。我的 NDK 是一个小型 r7,在 Ubuntu 上运行。但是我的lib只对标准c中的字节数组进行计算,这里没有访问Android的东西。

本机代码编译时没有警告和错误,是为 armeabi 和 armeabi-v7a 构建的。在 APK 中,libxyz.so 文件位于正确的文件夹中。导出函数的名称应该是正确的。但是即使在Java类中没有为它们声明并且没有调用任何native,crash直接发生在static { System.loadLibrary("libxyz.so"); }

我的 lib 二进制文件会不兼容吗?

感谢您的帮助!

更新:这些库确实不兼容,请参阅下面的 cmets。

【问题讨论】:

  • 考虑到 A) targetSdkVersion 允许的最小值为 28,今年晚些时候将增加到 29,以及 B) 包含原生的应用库是否必须包含这些库的 64 位版本?
  • 自 API 28 强制执行以来,我只在我的主页上发布更高版本。将来可能我的目标是29。那么添加arm64-v8a应该没问题。我目前的问题就是上面提到的。
  • 好吧,如果你遇到崩溃,你应该发布堆栈跟踪。
  • 最后我可以从设备读取 logcat(通过命令行 adb,在 Eclipse 中这不起作用)。该问题似乎是由二进制文件中的“文本重定位”引起的。 Logcat:“java.lang.UnsatisfiedLinkError ... dlopen 失败 ... libxyz.so 有文本重定位” 正如我所读到的,自 API 23 起,这些在库中是不允许的。有建议以 22 为目标的解决方法:-/ 但我当然想摆脱这些丑陋的“文本重定位”。尝试了 -fPIC 编译器标志但没有成功。 readelf -a libxyz.so|grep TEXTREL 显示“TEXTREL 0x0”。
  • 更新到较新的 NDK (9) 修复了 TEXTREL 错误。现在 System.loadLibrary 和调用本机方法适用于较新的 API。所以我必须安装 1.4 GB 的 NDK 来计算标准 c 中的东西。

标签: android android-ndk crash java-native-interface android-ndk-r7


【解决方案1】:

最后我可以从设备读取 logcat(通过命令行 adb,在 Eclipse 中这不起作用)。该问题似乎是由二进制文件中的 "text relocations" 引起的。

Logcat:“java.lang.UnsatisfiedLinkError ... dlopen 失败 ... libxyz.so 有文本重定位”

更新到更新的 NDK (9) 修复了 TEXTREL 错误。现在 System.loadLibrary 和调用本机方法适用于较新的 API。所以我必须安装 1.4 GB 的 NDK 来计算标准 c 中的东西。

【讨论】:

    猜你喜欢
    • 2014-11-06
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-22
    相关资源
    最近更新 更多