当我输入
java -Djava.library.path="path to opencv lib folder" : "path to my libJavaFileName.so" JavaFileName
我收到以下消息:
java: symbol lookup error: "path to my libJavaFileName.so": undefined symbol: _ZN2cv6String8allocateEm
undefined symbol: _ZN2cv6String8allocateEm
的含义是什么?我该如何解决?
答案 0 :(得分:1)
我怀疑您的Java JNI绑定与您的opencv版本之间存在版本不匹配。
未定义的符号:_ZN2cv6String8allocateEm之所以出现是因为你的libJavaFileName.so包含对该符号的引用,但链接器找不到任何定义它的目标文件。
您可以使用程序c ++ filt将符号解压缩为可读名称:
> c++filt -n _ZN2cv6String8allocateEm
cv::String::allocate(unsigned long)
如果你查看opencv 3.1的源代码,可以看到这个函数确实存在(它在核心模块的stl.cpp中)。
我的机器上的opencv库(版本2.4.8)中没有定义符号,但如果我从源代码构建版本3.1,则在libopencv_core.so中定义。
因此,我猜测你可能需要安装更新版本的opencv。
还值得检查它实际上是否正在加载您认为它的共享库的版本。如果你这样做:
strace -o log.txt java rest_of_your_command_line
然后,您可以查看log.txt以查看正在打开的共享库。尝试使用opencv这个文件来查看是否正在加载正确的版本。
答案 1 :(得分:0)
您的图书馆使用符号cv::String::allocate( unsigned long )
。
您需要加载提供本机代码所依赖的符号的正确共享对象。执行此操作的最佳方法是使用正确的-L library_name
选项编译本机共享对象,使其具有对这些对象的动态依赖关系。