2011-12-30 17 views
6

Sto tentando di accedere ai metodi dll in java che è stato scritto in C#. Dal codice seguente sto provando a compilare dll che viene generata con successo.Accesso ai metodi dll in java

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

Dopo questo sono caricamento della DLL generato nel mio codice programma Java cui dispositivo è del seguente

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

Dopo l'esecuzione di questo codice che mi sta dando il seguente errore.

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

Beh, non capisco cosa stia dicendo questo errore ma voglio risolverlo. E un'altra domanda che sto avendo è che il metodo che sto chiamando è un metodo statico che verrà chiamato in questo modo? Voglio dire di chiamare il metodo statico dobbiamo

"classname.methodname"

ecco che sarà in grado di chiamare il metodo?

+0

è necessario caricare la libreria nativa con 'System.loadLibrary()' - preferibilmente in una statica inizializzatore – fge

+0

@fge: i fatto . Non ha funzionato. – ankurtr

+0

Sapete, ovviamente, che .NET dll non sono dll standard e di per sé non funzionano con JNI. –

risposta

7

È possibile chiamare i metodi tramite JNI solo se tali metodi sono stati effettivamente progettati per essere chiamati in questo modo. I tuoi metodi assolutamente non lo sono. Quello che stai facendo qui è (mi spiace essere così schietto) assolutamente nessuna possibilità di riuscire, semplicemente non funziona in questo modo.

Ci sono diversi modi per procedere. Uno sarebbe quello di conoscere JNI e come scrivere librerie che effettivamente funzionano con esso. Here è il riferimento canonico per questo. Fare questo con C# aggiunge un altro livello di complessità, però.

Un altro modo sarebbe di abbandonare del tutto JNI e utilizzare un meccanismo più appropriato per accedere ai metodi. Puoi conoscere JNA qui; sarebbe del tutto migliore per i tuoi obiettivi.

+1

@ ankur-trapasiya - I suggerimenti di Ernest Friedman-Hill sono assolutamente, completamente corretti! Per favore ascoltalo! – paulsm4

+0

@ paulsm4: sto provando a farlo con JNA. – ankurtr

0

L'utilizzo di JNI non è corretto. È difficile (anche se non impossibile) usare JNI con le librerie C#. C'è un eccellente tutorial su come farlo su di esso here. Effettuare una ricerca JNI C# su google rivelerà di più.

Si dovrebbe anche indagare qualcosa come Grasshopper ..

EDIT

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

è una soluzione fresca.

+0

Il primo collegamento non è quello che sto cercando di fare. Si tratta di visual C++ e java. Questo viene fatto tramite JNI ma voglio farlo tra C# e java con o senza JNI. E nel secondo link c'è anche la risposta alla mia domanda. – ankurtr

+1

JNI non ha un'interfaccia diretta con C# .. Devi creare uno stub C++ tra C# e Java. –

+0

OOooh ho trovato una soluzione interessante per te. jni4net è bello come specificato da Jayan ma ... –

0

sito utile per voi: http://www.sahirshah.com/java/jni.html

Prova:

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

È necessario avvolgere la dll in una DLL C++ come descritto nel link qui sopra. Basta generare un file di intestazione con il comando "javah -jni myJNI" e creare una dll C++ con la firma della funzione trovata nel file di intestazione.

Dai un'occhiata alla: http://www.codeproject.com/KB/cross-platform/javacsharp.aspx per una specifica "ciao mondo" esempio in C#