Вызов C ++ из JMS с помощью JNI

0

Я пытаюсь назвать оболочку Sleuth Kit C++ через свою JNI-оболочку из JMS MessageListener. Но я получаю эту ошибку

java.lang.UnsatisfiedLinkError: /tmp/libtsk_jni.so: libtsk.so.10: не удается открыть файл общих объектов: нет такого файла или каталога

Я попытался справиться с libtsk_jni.so в /tmp, но никакой разницы. Но я могу сделать это в консольном приложении Java. Что может быть ошибкой?

public void onMessage(Message message) {
   try {
      String imagePath = "uploads/Cfreds001A001.dd";
         try{
            SleuthkitCase sk = SleuthkitCase.newCase(imagePath + ".db");

         } catch (TskCoreException ex) {

         } 
  } catch (JMSException ex) {
     Logger.getLogger(WorkerBean.class.getName()).log(Level.SEVERE, null, ex);
  } catch (InterruptedException ex) {
     Logger.getLogger(WorkerBean.class.getName()).log(Level.SEVERE, null, ex);
}
  • 0
    Где находится файл libtsk.so.10 ?
Теги:
jni
java-ee
jms

1 ответ

1
Лучший ответ

Попытка использовать собственные методы из кода, запущенного в контейнере Java EE, не допускается стандартом и может вызвать неопределенное поведение. См. Статью JavaWorld от августа 2000 года "Ограничения программирования на EJB", по-прежнему актуальной сегодня, насколько я знаю.

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

  • 0
    +1 за совет :), тогда какой стандартный способ я могу запустить Sleuth Kit или любой код C ++ из Java EE. Я уверен, что я не единственный, кто хочет сделать что-то подобное. O :) Разве библиотеки обработки изображений не используют нативные коды, такие как Sleuth Kit? :) Каким-то образом должен быть способ, верно? :)
  • 0
    Запустите Sleuth Kit в отдельном процессе. Вы можете каждый раз создавать этот процесс с помощью Runtime.exec , или он может быть длительным (даже на другом хосте) и принимать команды на сокете TCP, а метод onMessage будет использовать Socket для подключения к нему; или вы можете запустить его в базе данных, которая поддерживает хранимые процедуры Java или C (DB2, Oracle, Postgres ...) и подключиться через JDBC (хранится в JNDI).

Ещё вопросы

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