繁体   English   中英

访问使用OpenCV的C ++共享库的Java程序

[英]Java program that access C++ shared library that uses OpenCV

我们开发了一个使用OpenCV 2.4的C ++共享库( libAuxLinuxShared.so

我们还开发了一个命令行Java应用程序,可通过JNI访问libAuxLinuxShared.so 此应用程序已部署在Ubuntu 14.10中

运行Java应用程序时,我们得到以下结果:

Exception in thread "main" java.lang.UnsatisfiedLinkError: /vagrant/Milan/Linux/libAuxLinuxShared.so: /vagrant/Milan/Linux/libAuxLinuxShared.so: undefined symbol: _ZTVN2cv12_OutputArrayE
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1941)
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1857)
    at java.lang.Runtime.loadLibrary0(Runtime.java:870)
    at java.lang.System.loadLibrary(System.java:1122)
    at com.mi.pixme.PixmeJavaAPI.<clinit>(PixmeJavaAPI.java:8)
    at com.mi.pixme.PixmeCommandRunner.main(PixmeCommandRunner.java:11)

在我看来,制作libAuxLinuxShared.so时OpenCV没有正确链接,或者找不到OpenCV共享库。 我不是C ++专家,当然不是Linux下的专家,我不确定下一步该怎么做。

更多细节

我试图通过两种方式做到这一点:

  1. 将OpenCV设为共享库

  2. 将OpenCV设为静态库,并尝试将libAuxLinuxShared.so与它们链接(使用-l)。 我在Makefile中使用pkg-config --libs --cflags opencv来获取库的完整列表。

在两种情况下,我都得到相同的结果。

注意以下结果可能会有所帮助:

$ nm -D libAuxLinuxShared.so | grep _ZTVN2cv12_OutputArrayE

是:

U _ZTVN2cv12_OutputArrayE

即使我尝试进行OpenCV的静态链接。 该符号可能在opencv_core库中定义:

$ nm /usr/local/lib/libopencv_core.so | grep _ZTVN2cv12_OutputArrayE
00000000004b1de0 V _ZTVN2cv12_OutputArrayE

我还尝试设置LD_LIBRARY_PATH=/usr/local/lib:/usr/local/share/OpenCV/3rdparty/lib (这是OpenCV库所在的位置),但是结果是相同的。 我尝试的最后一件事是从Java应用程序加载opencv_core共享库(我认为_ZTVN2cv12_OutputArrayE所在的库):

  1. 添加到Java主类:

    System.loadLibrary(“ opencv_core”);

  2. 然后将/usr/local/lib到Java命令的库路径,如下所示:

    -Djava.library.path = / usr / local / lib:

但是,同样的结果。 我可以看到Java程序找到了该库,因为如果我将opencv_core更改为一个不存在的名称, opencv_core收到另一个错误(找不到该库)。 但是,当库名正确时,它对结果没有影响,这是抱怨_ZTVN2cv12_OutputArrayE未定义的例外。

编辑:以下要点包含我用于构建共享库的makefile: https : //gist.github.com/yanivby/69984a541e97e33d815a76a9bbf4d712

根据您的要点中的Makefiles,问题似乎是实际依赖那些库的对象之前提到了pkg-config --libs --cflags opencv ,它向链接器添加了一堆-l library参数。 。 在您的Makefile中,最简单的解决方法是将$(INCLUDES)引用移至命令的末尾$(LIBS)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM