2011-10-11 20 views
0

我編寫了一個獨立的Java程序(THAT WORKS),它通過生成libipmi_agent.so lib來調用從C程序創建的本地庫,但在web應用程序在Tomcat是給下面的錯誤:在tomcat中從.so調用Java中的本地庫時出錯

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類在同一個類文件夾/ web應用/ MyApp的/ WEB_INF /類。

該文件的位置是否正確?任何人有一個想法?

在此先感謝。

回答

0

構建一個獨立的程序在tomcat上不起作用,因爲包含在web-app結構中的獨立類有一個包名,所以tomcat找不到正確的路徑,因爲生成的本地庫是來自獨立應用程序,無包名。

2

錯誤是告訴你它無法找到庫,所以不,這個位置是不正確的。

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

(在FAQ中的錯誤是不同的,但問題是相同的,那裏的解決方案應該能夠解決你的問題)

+0

感謝您的回覆! 我實際上遵循了這個指南並創建了$ CATALINA_HOME/shared/lib目錄並且只有.so文件和java類...是否足夠,甚至是由javah生成的c類和頭文件必須在那裏? 另外$ LD_LIBRARY_PATH指向$ CATALINA_HOME/shared/lib。 任何想法是什麼? – mzereba

1

Java類不必是在$ CATALINA_HOME/shared/lib但只有.so庫。由於被賦予了同樣的問題,即使做了以下內容:

  1. 設置shared.loader在catalina.properties = $ CATALINA_HOME /共享/ lib目錄下。

  2. 出口LD_LIBRARY_PATH = '在/ usr /本地/ Tomcat的/共享/ lib目錄/'

爲什麼還沒有找到呢?我做錯了什麼,所以tomcat無法看到圖書館?

感謝任何人的幫助。

相關問題