Question

J'appelle une DLL en lui transmettant un objet de fonction de rappel. L'une des fonctions est l'impression simple. J'ai alors, une boucle de 100 itérations, imprimant juste l'index et quelques impressions après la boucle.

Voici le code C

extern "C" int Start(void* callback(CString))
{
   for(int j=0; j<100; j++)
    callback(AConvertToString(j));

   callback("in Start called from Java");
   callback("another line");
}

Voici le code Java

public interface MyDll extends Library{
  MyDll INSTANCE = (MyDll) Native.loadLibrary("MyDll",MyDll.class);
     public interface MyCallback extends StdCallCallback {
            public boolean callback(String msg);
     }
     public int Start(MyCallback callback);
  }

//in main:
...
  MyDll myDll = (MyDll)MyDll.INSTANCE;
  myDll.Start(new MyDll.MyCallback() {
      public boolean callback(String msg) {
         System.out.println(msg);
          return true;          
      }
});

La sortie est numérotée 0..41 (OUI 41 !!! pas 99), puis "Démarrer appelé depuis Java". suivie d'un accident terrible:

#
# An unexpected error has been detected by Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x7c809823, pid=468, tid=2636
#
# Java VM: Java HotSpot(TM) Client VM (10.0-b23 mixed mode, sharing windows-x86)
# Problematic frame:
# C  [kernel32.dll+0x9823]

J'ai lu beaucoup (ici aussi) mais je ne trouve pas le problème. Je suis sous JRE de Java6. J'ai 1,5 Go de mémoire sur ma machine. La DLL n’est utilisée par aucun autre processus (pas de problèmes de simultanéité).

Merci, Azriel

Était-ce utile?

La solution

Essayez d'écrire votre MyCallback en tant que com.sun.jna.Callback à la place en tant que com.sun.jna.win32.StdCallLibrary.StdCallCallback:

public interface MyDll extends Library{
  MyDll INSTANCE = (MyDll) Native.loadLibrary("MyDll",MyDll.class);
     public interface MyCallback extends Callback {
            public boolean callback(String msg);
     }
     public int Start(MyCallback callback);
  }

Cordialement, Emmanuel Girard

Autres conseils

Dans mon cas, développer une application télécom utilisant une dll win32 était le cas opposé.

À l'aide de com.sun.jna.Library et de com.sun.jna.Callback, la machine virtuelle était toujours bloquée lors du retour de l'appel de rappel.

Après avoir changé pour com.sun.jna.win32.StdCallLibrary et com.sun.jna.win32.StdCallLibrary.StdCallCallback, le problème a été résolu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top