【问题标题】:UnsatisfiedLinkError when compiling with API21使用 API21 编译时出现 UnsatisfiedLinkError
【发布时间】:2015-04-08 08:37:16
【问题描述】:

我的项目将 NDK r10d 用于 c++ 代码。 当我使用 API19 编译项目时,它运行良好,但是当我使用 API21 编译它时,它在运行时崩溃。

加载 c 库时,我得到:

dlopen("/data/app-lib/com.my.app-2/libMyCode.so") 失败:dlopen 失败:找不到“libMyCode.so”引用的符号“stpcpy”...

然后它崩溃了:

java.lang.UnsatisfiedLinkError: dlopen failed: 找不到“libMyCode.so”引用的符号“stpcpy”...

我使用运行 Android4.4.4 的 OnePlus One 在这两种情况下进行测试。

有什么想法吗?

【问题讨论】:

    标签: java android c++ android-ndk android-5.0-lollipop


    【解决方案1】:

    是的 - API 21 中的 android libc 标头已更改。以前不存在的一些函数被重定向到旧标头中的其他函数。因此,如果您想在旧设备上运行,则无法真正使用 API 21 构建,除非您非常小心地解决此类问题。如果您需要使用 API 21 中较新的本机 API,但仍与旧设备兼容,则无论如何您都需要进行手动操作。

    如果您只想为 java 端提供更新的 API,只需在 Application.mk 中设置一个单独的APP_PLATFORM=19,同时使用更新的 SDK 构建 java 端。

    有关此问题的更多详细信息,请参阅Cannot load library: reloc_library[1285]: cannot locate 'rand'

    【讨论】:

      【解决方案2】:

      stpcpy 已添加到 API 21 上的仿生。这意味着为 API 21 编译的二进制文件可能无法在早期平台上运行。它looks like gcc 编译器可以优化为调用stpcpy,即使它没有在您的代码中显式使用。链接的问题也有一个建议的解决方法:

      size_t src_len = strlen(src);
      return memcpy(dst, src, src_len) + src_len;
      

      【讨论】:

        【解决方案3】:

        问题可能是由于安全问题,已弃用的程序 strcpystrlen 已被删除。

        我将它们替换为 strncpystrnlen,效果很好。

        【讨论】:

          猜你喜欢
          • 2014-03-01
          • 2017-06-09
          • 1970-01-01
          • 2012-03-28
          • 1970-01-01
          • 2012-04-10
          • 1970-01-01
          • 2020-09-19
          • 1970-01-01
          相关资源
          最近更新 更多