【问题标题】: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】:
问题可能是由于安全问题,已弃用的程序 strcpy 和 strlen 已被删除。
我将它们替换为 strncpy 和 strnlen,效果很好。