2011-12-30 14 views
6

में डीएलएल विधियों तक पहुंचने के लिए मैं जावा में डीएलएल विधियों तक पहुंचने की कोशिश कर रहा हूं जो सी # में लिखा गया है। निम्नलिखित कोड से मैं सफलतापूर्वक जेनरेट करने वाले डीएलएल बनाने की कोशिश कर रहा हूं।जावा

using System; 
using Microsoft.Win32; 


namespace CyberoamWinHelper 
{ 
    public class RegistryAccess 
    {   
     public static String getValue(String key) 
     { 
      RegistryKey rk = Registry.CurrentUser; 
      RegistryKey rk1=rk.OpenSubKey("Software\\Test", RegistryKeyPermissionCheck.ReadWriteSubTree, System.Security.AccessControl.RegistryRights.FullControl); 
      rk1.SetValue(key, "val1"); 
      return rk1.GetValue(key).ToString(); 
     } 
     public static void createSubkey(String name) 
     { 
      RegistryKey rk = Registry.CurrentUser; 
      rk.CreateSubKey("Software\\Test"); 
     } 
    } 
} 

इस के बाद मैं अपने जावा प्रोग्राम कोड में उत्पन्न dll लोड कर रहा हूँ जिनमें से के रूप में

public class JNI { 

    /** 
    * @param args the command line arguments 
    */ 
    public native String getValue(String key);  

    public static void main(String[] args) { 
     // TODO code application logic here 

     try 
     { 
      System.loadLibrary("CyberoamWinHelper"); 
      JNI j=new JNI();  
      System.out.println(j.getValue("abc")); 
     } 
     catch(UnsatisfiedLinkError e) 
     { 
      System.out.println("Ex" + e.getMessage()); 
     } 
    } 
} 

इस प्रकार इस कोड को यह मुझे निम्न त्रुटि दे रहा है चलाने के बाद है।

"Exjni.JNI.getValue(Ljava/lang/String;)Ljava/lang/String;" 

वैसे मैं समझ नहीं पा रहा हूं कि यह त्रुटि क्या कह रही है लेकिन मैं इसे हल करना चाहता हूं। और एक और सवाल जो मैं कर रहा हूं वह है क्योंकि जिस विधि को मैं कॉल कर रहा हूं वह एक स्थिर विधि है जिसे इसे इस तरह से बुलाया जाएगा? मैं स्थिर विधि कॉल करने के मतलब है कि हम

"classname.methodname"

इसलिए यहाँ यह विधि कॉल करने में सक्षम हो जाएगा की जरूरत है?

+0

आप 'System.loadLibrary (साथ अपनी मूल पुस्तकालय लोड करने के लिए की जरूरत है' - अधिमानतः एक स्थिर प्रारंभकर्ता – fge

+0

@fge में:

पर एक नज़र डालें मैं इसे करें । यह काम नहीं किया। – ankurtr

+0

आप निश्चित रूप से जानते हैं कि .NET dll मानक डीएल नहीं हैं और स्वयं जेएनआई के साथ काम नहीं करते हैं। –

उत्तर

7

यदि आप उन तरीकों को वास्तव में इस तरह से बुलाए जाने के लिए डिजाइन किए गए हैं तो आप केवल जेएनआई के माध्यम से विधियों को कॉल कर सकते हैं। आपके तरीके बिल्कुल नहीं हैं। आप यहां क्या कर रहे हैं (इतनी बदमाश होने के लिए खेद है) बिल्कुल सफल होने का कोई मौका नहीं - यह बस इस तरह से काम नहीं करता है।

आपके द्वारा आगे बढ़ने के कई तरीके हैं। एक व्यक्ति जेएनआई और पुस्तकालयों को लिखने के बारे में सीखना होगा जो वास्तव में इसके साथ काम करते हैं। Here इसके लिए कैननिकल संदर्भ है। सी # के साथ ऐसा करने से जटिलता की एक और परत अभी भी जोड़ती है।

एक और तरीका जेएनआई को पूरी तरह से छोड़ना और विधियों तक पहुंचने के लिए एक और उचित तंत्र का उपयोग करना होगा। आप यहां JNA के बारे में जान सकते हैं; यह आपके लक्ष्यों के लिए पूरी तरह उपयुक्त होगा।

+1

@ अंकुर-फरासीया - अर्नेस्ट फ्राइडमैन-हिल के सुझाव बिल्कुल सही हैं, बिल्कुल सही! कृपया उसे सुनो! – paulsm4

+0

@ paulsm4: मैं इसे जेएनए के साथ करने की कोशिश कर रहा हूं। – ankurtr

0

जेएनआई का आपका उपयोग गलत है। सी # पुस्तकालयों के साथ जेएनआई का उपयोग करना मुश्किल है (हालांकि असंभव नहीं है)। here के बारे में कैसे जाना है इस पर एक उत्कृष्ट ट्यूटोरियल है। Google पर सी # जेएनआई खोज करना अधिक प्रकट होगा।

तुम भी Grasshopper की तरह कुछ की जाँच करनी चाहिए ..

संपादित

http://caffeine.berlios.de/site/documentation/quickstart.html

एक शांत समाधान है।

+0

वैसे पहला लिंक वह नहीं है जिसे मैं करने की कोशिश कर रहा हूं। यह दृश्य सी ++ और जावा के बारे में है। यह जेएनआई के माध्यम से किया जाता है लेकिन मैं इसे जेएनआई के साथ या उसके बिना सी # और जावा के बीच करना चाहता हूं। और दूसरे लिंक में भी मेरे प्रश्न का कोई जवाब नहीं है। – ankurtr

+1

जेएनआई के पास सी # के साथ कोई सीधा इंटरफ़ेस नहीं है .. आपको सी # और जावा के बीच एक सी ++ स्टब बनाना होगा। –

+0

ओओहोह मुझे आपके लिए एक अच्छा समाधान मिला। jan4net जयन द्वारा निर्दिष्ट के रूप में अच्छा है लेकिन ... –

0

आप के लिए उपयोगी साइट: http://www.sahirshah.com/java/jni.html

प्रयास करें:

public class myJNI { 

/** 
* @param args the command line arguments 
*/ 
public static native String getValue(String key);  
static 
{ 
    System.loadLibrary("CyberoamWinHelper"); 
} 
public static void main(String[] args) { 
    // TODO code application logic here 

    try 
    {  
     String myKey = "abc"; 
     System.out.println(getValue(myKey)); 
    } 
    catch(UnsatisfiedLinkError e) 
    { 
     System.out.println("Ex" + e.getMessage()); 
    } 
    } 
} 

आप उपरोक्त लिंक में वर्णित के रूप में एक C++ dll में dll रैप करने के लिए की जरूरत है। बस "javah -jni myJNI" कमांड के साथ एक हेडर फ़ाइल जेनरेट करें और उस हेडर फ़ाइल में पाए गए फ़ंक्शन हस्ताक्षर के साथ एक C++ dll बनाएं।) एक विशिष्ट के लिए http://www.codeproject.com/KB/cross-platform/javacsharp.aspx "हैलो दुनिया" सी # में उदाहरण