SAPфорум.RU
https://sapboard.ru/forum/

Проблема в UDF: вызов JNI-библиотеки
https://sapboard.ru/forum/viewtopic.php?f=70&t=92020
Страница 1 из 1

Автор:  Андрей Петин [ Вт, дек 15 2015, 19:06 ]
Заголовок сообщения:  Проблема в UDF: вызов JNI-библиотеки

Добрый день.

В маппинге в User-defined function используется набор Java-классов, в одном из которых происходит следующий вызов скомпилированной JNI-библиотеки libjiprivpg.so:
Code:
class IPriv_native
{
   static
   {
      System.loadLibrary("jiprivpg");
   }
...
}


При первом тесте данного маппинга функции из JNI-библиотеки выполнились успешно.
Однако при следующих запусках работа прекращается со следующим сообщением:
Code:
Runtime exception when processing target-field mapping /ns0:Coins/Status; root message: Exception:[java.lang.UnsatisfiedLinkError: Native Library /usr/sap/POD/J00/exe/libjiprivpg.so already loaded in another classloader] in class com.sap.xi.tf._MM_Test_ method TestLib


Т.е. библиотека уже куда-то загружена, и при последующих вызовах loadLibrary таким образом ругается.
Как можно эту проблему обойти? Где нужно выполнять loadLibrary, чтобы при различных прогонах маппинга это не загружалось в разных класслоадерах?

Автор:  Chaser009 [ Ср, дек 16 2015, 10:19 ]
Заголовок сообщения:  Re: Проблема в UDF: вызов JNI-библиотеки

Здравствуйте!

Вопрос, наверное, глупый, но не проще перед загрузкой проверять, загружена или нет? Или в Яве нет таких возможностей?

Автор:  Chaser009 [ Ср, дек 16 2015, 10:24 ]
Заголовок сообщения:  Re: Проблема в UDF: вызов JNI-библиотеки

Посмотрите здесь:
http://scn.sap.com/thread/15622

P.S. Ну и образцово-"костыльный" вариант никто не отменял: обернуть LoadLibrary в try...catch и забить :-)

Автор:  Андрей Петин [ Ср, дек 16 2015, 12:44 ]
Заголовок сообщения:  Re: Проблема в UDF: вызов JNI-библиотеки

Я так понял, не получится использовать функции библиотеки, если она загружена в другом classloader'е.
Попробовал выполнить код без строчки loadLibrary - ошибка, программа не может выполнить нативные вызовы.
Получается, даже если проверку как-либо всунуть, то библиотека доступна в данной ситуации не будет.

То есть непонятно, как правильно загружать JNI-библиотеку в SAP PI. И вообще практикуется ли это, а то на scn.sap.com нашёл только одно обсуждение подобной ситуации, и то вопрос не решён.

Автор:  Chaser009 [ Чт, дек 17 2015, 05:31 ]
Заголовок сообщения:  Re: Проблема в UDF: вызов JNI-библиотеки

А если попробовать то же самое через java-мэппинг? Может, там по-другому отработает. Плюс, может быть, там что-нибудь типа finalize можно замутить, чтобы выгрузить библиотеку после использования.
Или System.gc() попробовать.

Автор:  Андрей Петин [ Пт, дек 18 2015, 16:17 ]
Заголовок сообщения:  Re: Проблема в UDF: вызов JNI-библиотеки

Вроде решилась проблема. Помогла нота 542175, хоть она и не про SAP PI, но ситуация похожа.

Jar-файл, который вызывает линуксовую библиотеку (в дальнейшем "обёртка"), выложили в некоторую папку на сервере и вписали его в свойство Java-машины java.class.path (в Netweaver Administrator). Перезапустили Java-часть.
В SAP PI эту обертку не загружали после этого. Пакеты и классы, определенные в этой обертке, нормально импортируются и используются в других jar-файлах, которые уже, в свою очередь, встроены в SAP PI.

Получается доступ к линуксовой библиотеке через некий единый .jar, и конфликтов пока не было.

Автор:  Chaser009 [ Пн, дек 21 2015, 05:09 ]
Заголовок сообщения:  Re: Проблема в UDF: вызов JNI-библиотеки

Вот была, кстати, мысль - подсунуть библиотеки самому java-серверу PI, чтобы он сам их загружал. :-)

Страница 1 из 1 Часовой пояс: UTC + 4 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/