неопределенный символ: _ZTTN2cv4SURFE

0

Я хочу называть код 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++ вместо этого в конце. И это решило проблему.

Я не знаю, почему это работает, а предыдущие - нет. Но может быть, кто-то может мне сказать.

  • 0
    c++filt говорит мне, что первым символом является VTT for cv::SURF .
  • 0
    вы не связываете свой hello.so с библиотеками opencv
Показать ещё 5 комментариев
Теги:
opencv

1 ответ

0

Возможно, вам потребуется указать путь к вашим дополнительным библиотекам, чтобы JVM мог их загрузить. Добавьте аргумент в Java:

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

Этот аргумент должен появиться перед вашим именем класса, чтобы Java знал, что это аргумент для JVM, а не для вашей программы.

  • 0
    Спасибо за ответ. Но это не помогло ... Я добавил это: -Djava.library.path = / home / name / opencv-2.4.6.1 / lib :. к аргументам виртуальной машины в моей конфигурации запуска в Eclipse, но ошибка все та же.
  • 0
    @ User3119455. Каков путь к вашей библиотеке opencv? Я не вижу, что вы ссылаетесь на это ...
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню