6 votes

Accès aux méthodes dll en java

J'essaie d'accéder en Java à des méthodes de la DLL qui ont été écrites en C#. A partir du code suivant, j'essaie de construire la dll qui est générée avec succès.

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

Après cela, je charge la dll générée dans mon programme java dont le code est le suivant

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

Après avoir exécuté ce code, j'obtiens l'erreur suivante.

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

Je ne comprends pas ce que dit cette erreur mais je veux la résoudre. Et une autre question que je me pose est que, puisque la méthode que j'appelle est une méthode statique, sera-t-elle appelée de cette façon ? Je veux dire que pour appeler une méthode statique, nous avons besoin de

"nom de classe.nom de méthode"

donc ici pourra-t-il appeler la méthode ?

1voto

Jayan Points 7171

Pruebe jni4net . Extrait de leur site web. Des explications détaillées sont disponibles ici -> Comment fonctionne l'appel de Java à .NET dans jni4net

0voto

Ahmed Masud Points 6603

Votre utilisation de JNI est incorrecte. Il est difficile (mais pas impossible) d'utiliser JNI avec des bibliothèques C#. Il existe un excellent tutoriel sur la manière de procéder ici . Une recherche de C# JNI sur Google devrait permettre d'en savoir plus.

Vous devriez également rechercher quelque chose comme Sauterelle ..

EDITAR

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

est une solution intéressante.

0voto

Motes Points 1644

Site utile pour vous : http://www.sahirshah.com/java/jni.html

Essayez :

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

Vous devez envelopper la dll dans une dll c++ comme décrit dans le lien ci-dessus. Il suffit de générer un fichier d'en-tête avec la commande "javah -jni myJNI" et de construire une dll c++ avec la signature de la fonction trouvée dans ce fichier d'en-tête.

Consultez le site : http://www.codeproject.com/KB/cross-platform/javacsharp.aspx pour un exemple spécifique de "hello world" en C#

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X