我有一个本机库('处理器'),我使用依赖于libjpeg的Android NDK构建。但是,此问题可能与Android方面无关。我已经成功构建了库,但是当我尝试运行库时,无法正确加载此错误:
failed: dlopen failed: cannot locate symbol "jpeg_mem_src"
但是,如果我nm -D processor.so
确实包含符号:
...
U jpeg_CreateCompress
U jpeg_CreateDecompress
U jpeg_destroy_compress
U jpeg_destroy_decompress
U jpeg_finish_compress
U jpeg_finish_decompress
U jpeg_mem_dest
U jpeg_mem_src
U jpeg_read_header
U jpeg_read_scanlines
...
processor build.gradle:
sources {
main {
jni {
dependencies {
project ":jpeg"
}
}
}
}
ndk {
moduleName "processor"
cppFlags.add("-fexceptions")
ldLibs.add("log")
stl "gnustl_shared"
}
java端加载它:
static
{
try
{
Log.i("JNI", "Trying to load lib");
System.loadLibrary("gnustl_shared");
System.loadLibrary("processor");
}
catch (UnsatisfiedLinkError ule)
{
Log.e("JNI", ule.toString());
}
}
知道符号存在的原因,但无法找到?谢谢!
答案 0 :(得分:2)
根据Android版本的不同,您必须手动加载jpeg库(并将其包含在您的apk中)。
所以只需在静态块中添加一个System.loadLibrary("jpeg");
,就可以了。
顺便说一句,您可以在.so
文件中看到符号的事实只表示您的文件正在使用它们,而不是您的.so
提供了实现。您可以看到nm
报告带有U
字母的符号undefined
。