JNI «ошибка поиска символа» в разделяемой библиотеке в Linux

Что вы делаете, когда виртуальная машина Java имеет «ошибку поиска символа» при выполнении функции JNI? Ошибка поиска символа находится не в основной библиотеке общих объектов, поддерживающих интерфейс JNI, и не непосредственно в библиотеке, связанной с основной библиотекой объектов, а в библиотеке, которая связана с библиотекой, которая связана с вашим общим объектом JNI? (что за невероятно неловкое предложение ☺) В частности, что вы делаете, когда не контролируете код библиотеки, содержащей оскорбительный символ?

У меня проблема с использованием JNI для доступа к SDK для научной камеры (Андор NEO CMOS). Я использую подключаемый модуль Netbeans C / C ++ в RHEL 6 для создания общей библиотеки (AndorC.so), которая в основном создает оболочки JNI для методов, предоставляемых SDK камеры. SDK камеры предоставляет набор методов для доступа к камере, которые упакованы в библиотеку общих объектов (libatcore.so). Библиотека libatcore.so использует серию дополнительных библиотек, libatdevregcam.so (для реальной камеры), libatdevsimcam.so (для моделируемой камеры), libatcl_bitflow.so (низкоуровневый драйвер видеоплаты) и т. Д.

Я тщательно протестировал SDK камеры и без проблем могу получить доступ к камере из C / C ++.Я подключился к общей библиотеке (AndorC), которая реализует функции JNI из тестовой программы C (с использованием отдельного файла заголовка), и все работает правильно (т.е. я могу читать изображение, и программа завершается нормально).

Мой код Java может выполнять функции «InitializeLibrary» и «FinalizeLibrary» из SDK через интерфейс JNI, поэтому нет проблем с поиском основной библиотеки libatcore.so или моей библиотеки AndorC.so. Нет никаких проблем с базовой настройкой JNI. Однако, когда я пытаюсь выполнить функцию «Открыть» для камеры (т. Е. Функцию, которая фактически подключается к реальной и / или смоделированной камере), я получаю ошибку неопределенного символа в одной из библиотек, которые библиотеки libatcore.so используют в время выполнения (libdevsimcam.so).

/usr/local/java/jdk1.7.0_03/jre/bin/java: symbol lookup error: /usr/local/lib/libatdevsimcam.so: undefined symbol: _ZN20TAndorLibDebugOutput6OutputEPKciS1_xx24TAndorDebugFunctionLevel16TAndorDebugLevelS1_z
Java Result: 127

По сути, виртуальная машина Java не имеет проблем с libatcore.so (то есть с основным файлом библиотеки), и у нее нет проблем с поиском связанной библиотеки времени выполнения (/usr/local/lib/libatdevsimcam.so ), но он сталкивается с неопределенным символом в этой библиотеке, когда пытается открыть камеру (обратите внимание, что на самом деле я открываю настоящую камеру, а не смоделированную камеру).

Когда я проверил зависимости каждой из библиотек (libAndorC.so, libatcore.so, libatdevsimcam.so), я не обнаружил неопределенных символов. Очевидно, что неопределенный символ в библиотеке libatdevsimcam.so не является проблемой, когда программа запускается непосредственно из C / C ++, но вызывает проблему, когда виртуальная машина Java пытается загрузить libatdevsimcam.so.

 libAndorC.so
linux-vdso.so.1 =>  (0x00007fff507ff000)
libatcore.so.3 => /usr/local/lib/libatcore.so.3 (0x00007fe23a278000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007fe239f4a000)
libm.so.6 => /lib64/libm.so.6 (0x00007fe239cc6000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fe239ab0000)
libc.so.6 => /lib64/libc.so.6 (0x00007fe239730000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fe239513000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fe23930f000)
librt.so.1 => /lib64/librt.so.1 (0x00007fe239106000)
/lib64/ld-linux-x86-64.so.2 (0x0000003f07000000)
libatcore.so
linux-vdso.so.1 =>  (0x00007fffd53ff000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f7e6b645000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f7e6b440000)
librt.so.1 => /lib64/librt.so.1 (0x00007f7e6b238000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f7e6af31000)
libm.so.6 => /lib64/libm.so.6 (0x00007f7e6acac000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f7e6aa96000)
libc.so.6 => /lib64/libc.so.6 (0x00007f7e6a717000)
/lib64/ld-linux-x86-64.so.2 (0x0000003f07000000)
ldd libatdevsimcam.so
linux-vdso.so.1 =>  (0x00007fff247ef000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f5219dc4000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f5219bbf000)
librt.so.1 => /lib64/librt.so.1 (0x00007f52199b7000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f52196b0000)
libm.so.6 => /lib64/libm.so.6 (0x00007f521942b000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f5219215000)
libc.so.6 => /lib64/libc.so.6 (0x00007f5218e96000)
/lib64/ld-linux-x86-64.so.2 (0x0000003f07000000)

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

nm libatdevsimcam.so | grep _ZN20TAndor
             U _ZN20TAndorLibDebugOutput6OutputEPKciS1_xx24TAndorDebugFunctionLevel16TAndorDebugLevelS1_z

Я подумал, что, возможно, символ не был определен в версии отладочной версии библиотеки libatdevsimcam.so, поэтому я попытался собрать полную версию libAndorC.so, но у меня возникла та же проблема.

У меня два основных вопроса.

  1. Может ли это быть проблемой с изменением имен C ++? Я попытался скомпилировать программу тестирования камеры с помощью gcc вместо g ++ и столкнулся с большим количеством ошибок компиляции. Я читал, что искажение имен C ++ может вызвать проблемы.

  2. Это проблема библиотеки libatdevsimcam.so, предоставленной производителем? Я не могу контролировать код, предоставленный Андором для поддержки камеры (все, что я могу сделать, это пожаловаться).

Я в основном застрял на этом этапе, потому что все функции SDK требуют ссылки на дескриптор камеры, возвращаемой методом Open. Если я не могу открыть камеру, я не смогу продолжить разработку интерфейса JNI для камеры, которая мне нужна.

Я тщательно исследовал этот вопрос и не нашел ответов, которые непосредственно касались бы его. Это не стандартная ошибка «неудовлетворенная ссылка», которая так часто встречается в сообщениях JNI, и кажется, что базовая функциональность JNI работает (т.е. вы можете инициализировать и завершить библиотеку или вызвать любую функцию, которая не имеет прямого доступа к камере). Кажется, это ситуация, когда виртуальная машина Java сталкивается с проблемой, связанной с собственным кодом, который просто не запускает код напрямую. Как вы справляетесь с подобными проблемами? Это проблема, которую мне нужно передать производителю, или есть метод конфигурации / компиляции / связывания для решения этой проблемы?

Некоторые дополнительные сведения:

  • Netbeans 6.9.1 среда разработки
  • JDK 1.7_0_03 64-битный сервер
  • Компиляция исходных кодов как 64-битных (т.е. не должно быть проблем 32 и 64 бит)
10
задан Jennifer Milburn 5 March 2012 в 09:00
поделиться