在tomcat中从.so调用Java中的本机库时出错

时间:2011-10-11 15:22:29

标签: java tomcat native

我编写了一个独立的Java程序(THAT WORKS),它通过生成 libipmi_agent.so 库来调用从C程序创建的本机库,但是在tomcat中的web应用程序中运行它是给出以下错误:

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 与/ webapps / myapp / WEB_INF / classes下的上述Java类位于同一个类文件夹中。

文件的位置是否正确?有人有想法吗?

提前致谢。

3 个答案:

答案 0 :(得分:2)

错误告诉你它找不到库,所以不,那个位置不正确。

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

(常见问题解答中的错误不同,但问题是相同的,那里的解决方案应该可以解决您的问题)

答案 1 :(得分:1)

java类不必位于$ CATALINA_HOME / shared / lib中,只能位于.so库中。因为即使执行以下操作也会产生同样的问题:

  1. 在catalina.properties中设置shared.loader = $ CATALINA_HOME / shared / lib。

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

  3. 为什么还没找到它?我做错了什么,所以tomcat看不到图书馆?

    感谢能为您提供帮助的人。

答案 2 :(得分:0)

构建一个独立程序对tomcat没有用,因为web-app结构中包含的独立类有一个包名,所以tomcat无法找到正确的路径,因为生成的本机库是来自站点的那个单独的应用程序,没有包名。