未定义的符号:_ZTTN2cv4SURFE

时间:2013-12-19 14:40:12

标签: java c++ linux opencv

我想使用JNI从java调用C ++代码。我已经遵循了很多这方面的教程,当C ++代码“简单”时,一切正常。但是我要调用的C ++代码包含opencv库并使用它的各种功能。这就是我遇到问题的地方...... 我正在做的是以下内容:

1。)g ++ -fPIC -shared -I / usr / lib / jvm / java-1.7.0-openjdk-i386 / include -I / usr / lib / jvm / java-1.7.0-openjdk-i386 / include / linux -o libHello.so Hello.cpp

创建.so文件。

2。)我将创建的.so文件复制到我使用它的目录,就像我在教程中所做的那样,然后加载它:

static {
        System.loadLibrary("Hello");
       }

但是我得到一个带有未定义符号的UnSatisfiedLinkError:_ZTTN2cv4SURFE

很可能在第一步中出现错误,导致无法找到我的opencv库。但我不知道正确的命令会是什么。

ldd -d libHello.so产生:

linux-gate.so.1 =>  (0xb777d000)
libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb765e000)
libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb7640000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7496000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb746a000)
/lib/ld-linux.so.2 (0xb777e000)

未定义的符号:_ZTTN2cv4SURFE(./ libHello.so)

未定义的符号:_ZTV11CvStatModel(./ libHello.so)

未定义的符号:_ZTVN2cv24BackgroundSubtractorMOG2E(./ libHello.so)

未定义的符号:_ZTVN2cv4SURFE(./ libHello.so)

未定义的符号:_ZTV5CvSVM(./ libHello.so)

编辑:

对于其他遇到同样问题的人:

1。)正如有些人提到的,我没有链接到opencv库。

2。)但这还不够。我正在使用这个命令,因为它也在一些教程中完成:

g ++ -shared -I / usr / lib / jvm / java-1.7.0-openjdk-i386 / include -I / usr / lib / jvm / java-1.7.0-openjdk-i386 / include / linux -I / usr / local / include / opencv -L / usr / local / lib -lopencv_nonfree -lopencv_features2d -lopencv_core -lopencv_highgui Hello.cpp -o libHello.so

在执行“ldd”

时导致未定义的符号错误

我将命令更改为:

g ++ Hello.cpp -shared -I / usr / lib / jvm / java-1.7.0-openjdk-i386 / include -I / usr / lib / jvm / java-1.7.0-openjdk-i386 / include / linux -I / usr / local / include / opencv -L / usr / local / lib -lopencv_nonfree -lopencv_features2d -lopencv_core -lopencv_highgui -o libHello.so

即。我刚刚在g ++之后直接写了Hello.cpp。这解决了这个问题。

我不知道为什么这是有效的,而普遍的没有。但也许有人可以告诉我。

1 个答案:

答案 0 :(得分:0)

您可能需要指定其他库的路径,以便JVM可以加载它们。向Java添加一个参数:

-Djava.library.path=/path/to/opencv/libs:/other/paths/as/needed

此参数必须位于您的类名之前,以便Java知道它是JVM的参数,而不是您的程序。