Я хочу называть код C++ из java, используя JNI. Я уже следил за многими учебниками по этому вопросу, и все они работают, когда код C++ "прост". Но код C++, который я собираюсь назвать, включает библиотеку opencv и использует различные функции. И это, где я получаю проблемы... Что я делаю, так это следующее:
1.) g++ -fPIC -shared -I/usr/lib/jvm/java-1.7.0 -o penjdk -I 386/включить -I/usr/lib/jvm/java-1.7.0 -o penjdk -I 386/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)
undefined symbol: _ZTTN2cv4SURFE (./libHello.so)
undefined symbol: _ZTV11CvStatModel (./libHello.so)
undefined symbol: _ZTVN2cv24BackgroundSubtractorMOG2E (./libHello.so)
undefined symbol: _ZTVN2cv4SURFE (./libHello.so)
undefined symbol: _ZTV5CvSVM (./libHello.so)
редактировать:
Для кого-то другого возникает такая же проблема:
1.) Как говорили некоторые люди, я не связывался с библиотекой opencv.
2.) Но этого было недостаточно. Я использовал эту команду, как это сделано в некоторых учебниках:
g++ -shared -I/usr/lib/jvm/java-1.7.0 -o penjdk -I 386/включить -I/usr/lib/jvm/java-1.7.0 -o penjdk -I 386/include/linux -I/usr/local/include/opencv -L/usr/local/lib -L opencv_nonfree -L opencv_features2d -L opencv_core -L opencv_highgui Hello.cpp -o libHello.so
который вызвал неопределенную ошибку символа при выполнении "ldd"
Я изменил команду на:
g++ Hello.cpp -shared -I/usr/lib/jvm/java-1.7.0 -o penjdk -I 386/включить -I/usr/lib/jvm/java-1.7.0 [ CN03] penjdk -I 386/include/linux -I/usr/local/include/opencv -L/usr/local/lib -L opencv_nonfree -L opencv_features2d -L opencv_core -L opencv_highgui -o libHello.so
т.е. я просто написал Hello.cpp непосредственно после g++ вместо этого в конце. И это решило проблему.
Я не знаю, почему это работает, а предыдущие - нет. Но может быть, кто-то может мне сказать.
Возможно, вам потребуется указать путь к вашим дополнительным библиотекам, чтобы JVM мог их загрузить. Добавьте аргумент в Java:
-Djava.library.path=/path/to/opencv/libs:/other/paths/as/needed
Этот аргумент должен появиться перед вашим именем класса, чтобы Java знал, что это аргумент для JVM, а не для вашей программы.
c++filt
говорит мне, что первым символом являетсяVTT for cv::SURF
.