使用 API21 编译时出现 UnsatisfiedLinkError

UnsatisfiedLinkError when compiling with API21

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

加载 c 库后,我得到:

dlopen("/data/app-lib/com.my.app-2/libMyCode.so") failed: dlopen failed: cannot locate symbol "stpcpy" referenced by "libMyCode.so"...

然后崩溃于:

java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "stpcpy" referenced by "libMyCode.so"...

我用 OnePlus One 运行 Android4.4.4 来测试这两种情况。

有什么想法吗?

是 - android libc headers 在 API 21 中发生了变化。一些以前不存在的函数被重定向到旧 headers 中的其他函数.因此,如果你想在旧设备上 运行 ,你不能真正使用 API 21 构建,除非你非常小心地解决这些问题。如果您需要使用来自 API 21 的较新的本机 APIs 但仍然与旧设备兼容,则无论如何您都需要手动完成此操作。

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

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

stpcpy was added to bionic on API 21. This means that the binaries compiled for API 21 may fail to run on earlier platforms. It looks like gcc 编译器可以优化调用 stpcpy,即使它没有在您的代码中显式使用。链接的问题也有建议的解决方法:

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

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

我用 strncpystrnlen 替换了它们,效果很好。