Ошибка вызова нативной библиотеки на Java из .so в tomcat - PullRequest
0 голосов
/ 11 октября 2011

Я написал отдельную Java-программу (ЭТО РАБОТАЕТ), она вызывает собственную библиотеку, созданную из программы на C путем создания библиотеки libipmi_agent.so , но ее запуск в веб-приложении на 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.

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

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

Ответы [ 3 ]

2 голосов
/ 11 октября 2011

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

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

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

1 голос
/ 12 октября 2011

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

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

  2. export LD_LIBRARY_PATH = '/ usr / local / tomcat / shared / lib /'

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

Спасибо за помощь.

0 голосов
/ 16 октября 2011

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

...