2011-12-30 24 views
6

Estoy tratando de acceder a los métodos dll en Java que se han escrito en C#. Desde el siguiente código estoy tratando de construir dll que se genera con éxito.Accediendo a los métodos dll en 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"); 
     } 
    } 
} 

Después de esto estoy cargar la DLL generada en mi código de programa java de los cuales es el siguiente

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

Después de ejecutar este código es que me da el siguiente error.

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

Bueno, no entiendo lo que dice este error, pero quiero resolverlo. Y una pregunta más que estoy teniendo es que dado que el método que estoy llamando es un método estático ¿se llamará de esta manera? me refiero a llamar al método estático que necesitamos

"classname.methodname"

así que aquí va a ser capaz de llamar al método?

+0

necesita cargar su biblioteca nativa con 'System.loadLibrary()' - preferiblemente en un inicializador estático – fge

+0

@fge: i lo hizo . No funcionó. – ankurtr

+0

Usted sabe, por supuesto, que los .NET dll no son dll estándar y que por sí solos no funcionan con JNI. –

Respuesta

7

Solo puede llamar a los métodos a través de JNI si esos métodos fueron diseñados para llamarse de esta manera. Tus métodos absolutamente no lo son. Lo que estás haciendo aquí (lo siento por ser tan directo) absolutamente ninguna posibilidad de tener éxito, simplemente no funciona de esta manera.

Existen varias formas de proceder. Uno sería aprender sobre JNI y cómo escribir bibliotecas que realmente funcionan con él. Here es la referencia canónica para esto. Sin embargo, hacer esto con C# agrega otra capa de complejidad.

Otra forma sería renunciar por completo a JNI y utilizar un mecanismo más apropiado para acceder a los métodos. Puedes aprender sobre JNA aquí; sería más adecuado para tus objetivos.

+1

@ ankur-trapasiya - ¡Las sugerencias de Ernest Friedman-Hill son absolutamente, totalmente correctas! Por favor escúchalo! – paulsm4

+0

@ paulsm4: estoy tratando de hacerlo con JNA. – ankurtr

0

Su uso de JNI es incorrecto. Es difícil (aunque no imposible) utilizar JNI con bibliotecas C#. Hay un excelente tutorial sobre cómo hacerlo here. Hacer una búsqueda de C# JNI en google revelará más.

También debe investigar algo así como Grasshopper ..

EDITAR

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

es una solución fresca.

+0

Bueno, el primer enlace no es lo que estoy tratando de hacer. Se trata de Visual C++ y Java. Eso se hace a través de JNI, pero quiero hacerlo entre C# y java con o sin JNI. Y en el segundo enlace también hay una respuesta a mi pregunta. – ankurtr

+1

JNI no tiene ninguna interfaz directa con C# .. Tiene que crear un talón de C++ entre C# y Java. –

+0

OOooh he encontrado una solución genial para ti. jni4net es bueno como lo especifica Jayan, pero ... –

0

sitio útil para usted: http://www.sahirshah.com/java/jni.html

Probar:

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

Es necesario para envolver el archivo DLL en un ++ DLL c como se describe en el enlace anterior. Simplemente genere un archivo de encabezado con el comando "javah -jni myJNI" y cree un dll C++ con la firma de función que se encuentra en ese archivo de encabezado.

Tenga una mirada en: http://www.codeproject.com/KB/cross-platform/javacsharp.aspx específica para un "hola mundo" ejemplo en C#

Cuestiones relacionadas