#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:
Ошибка сообщает вам, что она не может найти библиотеку, так что нет, эта позиция неверна.
(Ошибка в 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 . Потому что возникает та же проблема, даже при выполнении следующего:
-
установка shared.loader=$CATALINA_HOME/shared/lib в catalina.properties.
-
экспорт LD_LIBRARY_PATH=’/usr/local/tomcat/shared/lib/’
почему он до сих пор не найден? что я делаю не так, чтобы tomcat не мог видеть библиотеку?
Спасибо всем, кто может помочь.
Ответ №3:
Создание автономной программы не работало на tomcat, потому что у автономного класса, включенного в структуру веб-приложения, было имя пакета, поэтому tomcat не смог найти правильный путь, поскольку сгенерированная собственная библиотека была из автономного приложения без имени пакета.