2015-06-03 11 views
5

के साथ काम करते समय असंतुष्ट लिंक्स त्रुटि अपवाद मैं jni4net के माध्यम से जावा से सी # (डीएलएल) फ़ंक्शन पढ़ने पर काम कर रहा हूं और मूल जावा में मैं डीएलएल फ़ंक्शन से मूल्य प्राप्त करने में सफल रहा हूं लेकिन अब मैंने एक डायनामिक वेब बनाया है प्रोजेक्ट और सर्वलेट में समान कार्यक्षमता का उपयोग करने की कोशिश की। लेकिन अब केवल डीएलएल फ़ाइल सफलतापूर्वक लोड की जाती है, फ़ंक्शन को सफलतापूर्वक नहीं कहा जाता है। नीचे है कि मैं क्या करने की कोशिश की अब तक:डीएसएल और जावा jni4net

मेरे सर्वलेट:

public class LoginProcess extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

     try { 

      Bridge.setVerbose(true); 
      Bridge.init(); 
      Console.WriteLine("Hello .NET world!\n"); 

      Bridge.LoadAndRegisterAssemblyFrom(new File("C:/Users/ashish.it/workspace/FinalJniWeb/WebContent/WEB-INF/lib/ADHelper.j4n.dll")); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     Enum output; 
     output=ADHelper.Login("user", "pass"); 
     System.out.println(output); 
    } 
} 

फर्क सिर्फ इतना है जब मैं इस कोर में जावा है कि मैं पूर्ण पथ का उपयोग नहीं किया था बजाय मैं केवल "lib इस्तेमाल किया बनाया/ADHelper.j4n.dll "पथ के लिए लेकिन किसी भी तरह से यह सर्वलेट में काम नहीं कर रहा था इसलिए मैंने इसे पथ को पूरा करने के लिए बदल दिया। वैसे भी डीएलएल फ़ाइल सफलतापूर्वक लोड किया जाता है।

ADHelper.generated.cs

namespace ADHelper { 
    public partial class ADHelper_ { 

methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "Login", "Login2", "(Ljava/lang/String;Ljava/lang/String;)Lsystem/Enum;")); 

    private static global::net.sf.jni4net.utils.JniHandle Login2(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__class, global::net.sf.jni4net.utils.JniLocalHandle UserName, global::net.sf.jni4net.utils.JniLocalHandle Password) { 
      // (Ljava/lang/String;Ljava/lang/String;)Lsystem/Enum; 
      // (LSystem/String;LSystem/String;)LADHelper/ADHelper+LoginResult; 
      global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); 
      global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); 
      try { 
      @__return = global::net.sf.jni4net.utils.Convertor.StrongC2Jp<global::ADHelper.ADHelper.LoginResult>(@__env, global::ADHelper.ADHelper.Login(global::net.sf.jni4net.utils.Convertor.StrongJ2CString(@__env, UserName), global::net.sf.jni4net.utils.Convertor.StrongJ2CString(@__env, Password))); 
      }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} 
      return @__return; 
     } 
} 

underdscore नाम ADHelper वर्ग जब मैं proxygen आदेश दौड़ा को मिश्रित किया गया था। dll फ़ाइल में समारोह लॉग इन() भी Login2(), लेकिन Login2() रख दिया गया ADHelper और ADHelper

नामित दो वर्गों जबकि लॉग इन मेरी सर्वलेट() द्वारा मान्यता प्राप्त नहीं है मान्यता प्राप्त है देखते हैं।

जनरेट किया गया जावा वर्ग ADHelper.java

package adhelper; 

@net.sf.jni4net.attributes.ClrType 
public class ADHelper extends system.Object { 

private static system.Type staticType; 

    protected ADHelper(net.sf.jni4net.inj.INJEnv __env, long __handle) { 
      super(__env, __handle); 
    } 

    @net.sf.jni4net.attributes.ClrConstructor("()V") 
    public ADHelper() { 
      super(((net.sf.jni4net.inj.INJEnv)(null)), 0); 
     adhelper.ADHelper.__ctorADHelper0(this); 
    } 

@net.sf.jni4net.attributes.ClrMethod("(LSystem/String;LSystem/String;)LADHelper/ADHelper+LoginResult;") 
    public native static system.Enum Login(java.lang.String UserName, java.lang.String Password); 

public static system.Type typeof() { 
     return adhelper.ADHelper.staticType; 
    } 

private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { 
     adhelper.ADHelper.staticType = staticType; 
    } 
} 

सभी मानचित्रण सही है लेकिन मेरा लॉग इन समारोह unsatisfiedLinkError दे रहा है। पढ़ने के दौरान धैर्य रखने के लिए धन्यवाद, कृपया मेरी समस्या का समाधान दें।

के बाद त्रुटि सांत्वना पर आ रहा है:

*All Dll file loaded message* 
Jun 3, 2015 10:56:39 AM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet LoginProcess threw exception 
java.lang.UnsatisfiedLinkError: adhelper.ADHelper.Login(Ljava/lang/String;Ljava/lang/String;)Lsystem/Enum; 
    at adhelper.ADHelper.Login(Native Method) 
    at com.karvy.login.LoginProcess.doGet(LoginProcess.java:62) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:723) 
    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:103) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
    at java.lang.Thread.run(Thread.java:662) 

उत्तर

1

मैंने इसे क्लासलोडर समस्या माना क्योंकि यह तब नहीं था जब मैंने बाद में अपनी फाइलों को उसी क्लासलोडर से लोड करने के लिए दबा दिया।

आगे की परीक्षा से पता चला कि जिस मार्ग को मैं दे रहा था वह निर्देशिका में फ़ाइल का सीधा पथ था, और सर्वलेट संदर्भ क्षेत्र में फ़ाइल के समान दिशा को इंगित नहीं कर रहा था। इसके लिए मुझे servlet context object बनाना था और उसके बाद getResuorce विधि को कॉल किया गया ताकि मैं अपनी फाइल को प्राप्त कर सकूं और उपयोग करने के लिए तैयार हो सकूं।

ServletContext context = getServletContext(); 
String realPath = context.getRealPath("/WEB-INF/lib/ADHelper.j4n.dll"); 
File file = new File(realPath); 

आप @ सुरभि-राय अपने समर्थन के लिए धन्यवाद:

यहाँ सर्वलेट संदर्भ दायरे से फ़ाइल प्राप्त करने के लिए कोड है। मैंने इस आश्रय को पोस्ट किया है यदि भविष्य में किसी को भी यह समस्या आती है तो यहां आ सकता है। धन्यवाद और स्वागत है। ☻

2

शायद तुम वर्ग-लोडर अलग संदर्भ में विभिन्न वर्ग लोडर से अपनी फ़ाइल लोड करने के लिए परीक्षण कर सकते हैं।

+1

मैं वेब संदर्भ क्लासलोडर से लोड करने के लिए डीएल को मजबूर कर रहा हूं लेकिन कोई बदलाव नहीं है। –

1

सर्वलेट संदर्भ के ऑब्जेक्ट के माध्यम से अपना फ़ाइल संदर्भ प्राप्त करें और उसके बाद getResource विधि को कॉल करें।

अभी आप स्थानीय डीआईआर को इंगित कर रहे हैं जो सर्वलेट संदर्भ क्षेत्र में नहीं है।

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