У меня есть класс Java (eval.java), который вызывает собственный метод в так файл (libmodel.so). Я могу использовать System.loadLibrary () для загрузки libmodel.so без любой ошибки (-Djava.library.path =/usr/lib), и собственный метод initModel () хорошо работает.
Однако, когда я развертываю его как веб-сервис (кот 6.0.26 +, axis2 1.5.1 + затмевает Java EE helios) для вызова собственного метода, я получил следующую ошибку (первая строка означает, что .so был успешно загружен):
Load library successfully [ERROR] com.model.modelJNI.initModel()V java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.axis2.rpc.receivers.RPCUtil.invokeServiceClass(RPCUtil.java:194) at org.apache.axis2.rpc.receivers.RPCMessageReceiver.invokeBusinessLogic(RPCMessageReceiver.java:102) at org.apache.axis2.receivers.AbstractInOutMessageReceiver.invokeBusinessLogic(AbstractInOutMessageReceiver.java:40) at org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:114) at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:173) at org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:167) at org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:142) at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) at java.lang.Thread.run(Thread.java:619) Caused by: java.lang.UnsatisfiedLinkError: com.model.modelJNI.initModel()V at com.model.modelJNI.initModel(Native Method) at com.model.model.initModel(model.java:13) at com.webservice.run(EvalVita.java:763) ... 25 more
Ниже тело Eval.java
import com.model.*;
public class Eval {
static void loadModel() {
try {
System.loadLibrary("model");
System.out.println("Load library successfully");
} catch (UnsatisfiedLinkError e) {
System.err.println("Native code library failed to load." + e);
}
}
public void run() {
loadModel();
model.initModel();
}
}
Я пропускаю что-нибудь здесь? Любой вход ценится!
Это, вероятно, означает, что библиотека была загружена успешно, но отдельная функция, необходимая JNI, не может быть найдена (или объявлена неправильно). Вот пример того, как должен выглядеть ваш код на C:
/*
* Class: com_model_modelJNI
* Method: initModel
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_model_modelJNI_initModel
(JNIEnv * env, jclass jclazz)
{
// etc.
}
Я никогда раньше не использовал Swig, поэтому не уверен, как он работает с JNI. Но вы можете попробовать использовать javah и посмотреть, что он выводит, чтобы сравнить.