找不到符号

时间:2016-03-21 18:58:04

标签: android c android-ndk java-native-interface

我有一个本机库('处理器'),我使用依赖于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());
    }
}

知道符号存在的原因,但无法找到?谢谢!

1 个答案:

答案 0 :(得分:2)

根据Android版本的不同,您必须手动加载jpeg库(并将其包含在您的apk中)。

所以只需在静态块中添加一个System.loadLibrary("jpeg");,就可以了。

顺便说一句,您可以在.so文件中看到符号的事实只表示您的文件正在使用它们,而不是您的.so提供了实现。您可以看到nm报告带有U字母的符号undefined