使用API​​21进行编译时出现UnsatisfiedLinkError

我的项目使用NDK r10d作为c ++代码。 当我使用API​​19编译项目时,它工作得很好,但是当我使用API​​21编译它时,它会在运行时崩溃。

当c lib被加载时,我得到:

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

然后它崩溃了:

java.lang.UnsatisfiedLinkError:dlopen失败:无法找到“libMyCode.so”引用的符号“stpcpy”…

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

有任何想法吗?

是的 – 在API 21中更改了android libc标头。以前不存在的某些function被重定向到旧标头中的其他function。 因此,如果您想在旧设备上运行,则无法使用API​​ 21构建,除非您非常谨慎地解决此类问题。 如果您需要使用API​​ 21中较新的本机API但仍与旧设备兼容,则无论如何都需要手动完成此操作。

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

请参阅无法加载库:reloc_library [1285]:无法找到“rand”以获取有关此问题的更多详细信息。

在API 21 上将stpcpy添加到bionic。这意味着为API 21编译的二进制文件可能无法在早期平台上运行。 看起来 gcc编译器可以优化调用stpcpy即使它没有在代码中明确使用。 链接的问题还有一个建议的解决方法:

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

问题是可能是因为安全问题,删除了已弃用的程序strcpystrlen

我用strncpystrnlen替换它们并且效果很好。