2016-03-21 134 views
1

我有一个本机库('处理器'),我正在使用依赖libjpeg的Android NDK构建。但是,这个问题可能与Android方面无关。我已经成功地建立了图书馆,但是当我尝试运行库无法与此错误正确加载:如果我nm -D processor.so它确实包含符号找不到符号

failed: dlopen failed: cannot locate symbol "jpeg_mem_src" 

但是:

... 
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 
... 

处理器的build.gradle:

sources { 
    main { 
     jni { 
      dependencies { 
       project ":jpeg" 
      } 
     } 
    } 
} 

ndk { 
    moduleName "processor" 
    cppFlags.add("-fexceptions") 
    ldLibs.add("log") 
    stl "gnustl_shared" 
} 

Java端加载它

任何想法为什么符号存在,但无法找到?谢谢!

回答

2

取决于Android的版本中,你将不得不手动加载JPEG文件(并将其包含在您的APK呢!)

所以只需添加一个System.loadLibrary("jpeg");到你的静态块,它应该做的伎俩。

顺便说一句,你可以在你的.so文件中看到符号的事实只意味着你的文件正在使用它们,而不是你的.so提供了一个实现。您可以看到它为nmU字母报告符号,undefined

+0

啊,谢谢。所以如果他们没有定义'U',那么我可能在生成图书馆时做了错误的事情? (我已经尝试添加'System.loadLibrary(“jpeg”)',但我得到相同的错误,所以有可能我由于某种原因生成了所有库) – Anthony

+0

在libjpeg.so中: 000000000001dca0 T jpeg_mem_src – Anthony

+0

您的库取决于libjpeg(如在build.gradle文件的依赖项块中所述)。这意味着你的库需要'libjpeg.so'文件在被加载之前被加载。你可以通过在你的文件上运行'readelf -d'来检查它,ti会显示你所有其他需要的共享库。您可以安全地忽略libc,因为它始终由Android加载,但您必须手动加载其他libc。 – NiBZ