Ошибка вызова собственной библиотеки в Java из .so в tomcat

#java #tomcat #native

#java #tomcat #родной

Вопрос:

Я написал отдельную Java-программу (КОТОРАЯ РАБОТАЕТ), она вызывает собственную библиотеку, созданную из программы на C, путем генерации libipmi_agent .итак, библиотека, но запуск ее в веб-приложении в tomcat выдает следующую ошибку:

 native library call java.lang.reflect.InvocationTargetException
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
...
java.lang.UnsatisfiedLinkError: org.qcri.power.util.IPMIAgent.ipmi_agent_init()I 
    org.qcri.power.util.IPMIAgent.ipmi_agent_init(Native Method)
    org.qcri.power.util.IPMIAgent.main(IPMIAgent.java:18)
...
  

Вот мой класс Java:

 package org.qcri.power.util;

public class IPMIAgent
{
  private native int ipmi_agent_init();
  private native void ipmi_agent_close();
  private native int ipmi_agent_read_current_value();
  static
    {
      System.loadLibrary("ipmi_agent");
    }

  // The main program
  public static int main(String[] args)
    {
        int i, v=0;
        IPMIAgent ipmiagent = new IPMIAgent();
        ipmiagent.ipmi_agent_init();
        for (i = 0; i < 100; i  )
        {
          try{
          v = ipmiagent.ipmi_agent_read_current_value();
          System.out.println("Current value is "   v);
          Thread.currentThread().sleep(1000);
          }
          catch(InterruptedException ie){
          }
        }
        return v;
    }
}
  

libipmi_agent.so находится в той же папке класса, что и вышеупомянутый класс Java в /webapps/myapp/WEB_INF/classes .

правильна ли позиция файла? у кого-нибудь есть идея?

Заранее спасибо.

Ответ №1:

Ошибка сообщает вам, что она не может найти библиотеку, так что нет, эта позиция неверна.

http://wiki.apache.org/tomcat/HowTo#I.27m_encountering_classloader_problems_when_using_JNI_under_Tomcat

(Ошибка в FAQ отличается, но проблема та же, и решение там должно решить вашу проблему)

Комментарии:

1. Спасибо за ваш ответ! Я действительно следовал этому руководству и создал каталог $ CATALINA_HOME / shared / lib и там есть файл .so и класс java ONLY…is этого достаточно или даже классы c и заголовок, сгенерированные javah, должны быть там? Также $LD_LIBRARY_PATH указывает на $CATALINA_HOME/shared/lib . Есть идеи, что это может быть?

Ответ №2:

Класс java не обязательно должен находиться в $ CATALINA_HOME / shared / lib, а только в библиотеке .so . Потому что возникает та же проблема, даже при выполнении следующего:

  1. установка shared.loader=$CATALINA_HOME/shared/lib в catalina.properties.

  2. экспорт LD_LIBRARY_PATH=’/usr/local/tomcat/shared/lib/’

почему он до сих пор не найден? что я делаю не так, чтобы tomcat не мог видеть библиотеку?

Спасибо всем, кто может помочь.

Ответ №3:

Создание автономной программы не работало на tomcat, потому что у автономного класса, включенного в структуру веб-приложения, было имя пакета, поэтому tomcat не смог найти правильный путь, поскольку сгенерированная собственная библиотека была из автономного приложения без имени пакета.