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

时间:2015-04-08 08:37:16

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

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

当加载c lib时,我得到:

  

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

引用

然后它崩溃了:

  

java.lang.UnsatisfiedLinkError:dlopen失败:找不到符号" stpcpy"由" libMyCode.so" ...

引用

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

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

在API 21上将

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

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

答案 2 :(得分:0)

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

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