2010-07-01 13 views
6

मेरे पास एक जावा क्लास (eval.java) है जो एक फ़ाइल (libmodel.so) में मूल विधि का आह्वान करता है। मैं system.loadLibrary() का उपयोग libmodel.so को बिना किसी त्रुटि के लोड करने के लिए कर सकता हूं (-Djava.library.path =/usr/lib), और देशी विधि initModel() ठीक काम करता है।java.lang.UnsatisfiedLinkError tomcat

हालांकि, जब मैं देशी विधि को कॉल करने के लिए इसे वेब सेवा (टॉमकैट 6.0.26 + अक्ष 2 1.5.1 + ग्रहण ईई हेलीओस) के रूप में तैनात करता हूं, तो मुझे निम्न त्रुटि मिलती है (पहली पंक्ति का अर्थ है। सफलतापूर्वक लोड):

 
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(); 
    } 
} 

के शरीर मैं यहाँ कुछ भी याद आ रही हूँ है? किसी भी इनपुट की सराहना की है!

+0

क्या आपने निश्चित रूप से उसी java.library.path को निर्दिष्ट किया है जब टॉमकैट के तहत चल रहा हो? –

+0

हां, टॉमकैट में लाइब्रेरी पथ है। /usr/java/jdk1.6.0_01/jre/lib/i386/server: /usr/java/jdk1.6.0_01/jre/lib/i386: /usr/java/jdk1.6.0_01/jre/../lib/i386: /usr/lib/xulrunner-1.9:/usr/java/packages/lib/i386:/lib:/usr/lib – mouthu

+0

मुझे लगता है कि यह tomcat classpath है, लेकिन क्या आप पास करते हैं -Djava.library.path =/jr के लिए usr/lib तर्क आप tomcat चल रहे हैं? –

उत्तर

2

यह शायद मतलब है कि पुस्तकालय सफलतापूर्वक लोड किया गया था, लेकिन अलग-अलग समारोह JNI की जरूरत नहीं पाया जा सका (या ठीक से घोषित नहीं किया गया था)। यहाँ अपने सी कोड की तरह दिखना चाहिए का एक उदाहरण है:

/* 
* Class:  com_model_modelJNI 
* Method: initModel 
* Signature:()V 
*/ 
JNIEXPORT void JNICALL Java_com_model_modelJNI_initModel 
    (JNIEnv * env, jclass jclazz) 
{ 
    // etc. 
} 

मैंने पहले बड़ा घूँट उपयोग नहीं किया है, तो मुझे यकीन है कि यह कैसे काम करता है JNI के साथ नहीं कर रहा हूँ। लेकिन आप तुलना करने के लिए javah का उपयोग करके और आउटपुट का उपयोग करने का प्रयास करना चाहेंगे।

+0

धन्यवाद, मैट। मैं बड़ा घूँट द्वारा उत्पन्न आवरण कोड की जाँच की और यह समान बात तुम्हें तैनात था:

 JNIEXPORT void JNICALL Java_com_model_modelJNI_initModel(JNIEnv *jenv, jclass jcls) { (void)jenv; (void)jcls; initModel(); } 
मैं सिर्फ कारण है कि यह स्टैंडअलोन अनुप्रयोग के लिए काम करता है लेकिन तैनात वेब सेवा के लिए नहीं सोच रहा था। – mouthu

+0

क्या यह संभव है कि 'libmodel.so' फ़ाइल को टोमकैट जेवीएम से लोड किया जा रहा है, जो आपके स्टैंडअलोन टेस्ट से लोड नहीं है? –

संबंधित मुद्दे