3

コールバック関数オブジェクトを渡して DLL を呼び出しています。その機能の1つが簡易印刷です。次に、100回の反復のループがあり、ループの後にインデックスといくつかの印刷物を印刷するだけです。


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

ここに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;          
      }
});

出力は数字 0..41 (YES 41!!! 99 ではない) であり、「Java から呼び出された開始」の後に恐ろしいクラッシュが続きます。

#
# 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]

私は(ここでも)たくさん読んだことがありますが、問題を見つけることができません。Java6 の JRE を実行しています。私のマシンには1.5GBのメモリがあります。DLL は他のプロセスでは使用されません (同時実行の問題はありません)。

ありがとう、アズリエル

4

2 に答える 2

4

MyCallbackをcom.sun.jna.win32.StdCallLibrary.StdCallCallbackとしてではなくcom.sun.jna.Callbackとして記述してみてください。

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

よろしく、エマニュエルジラール

于 2009-08-19T09:16:34.217 に答える
2

私の場合、win32 dll を使用する通信アプリケーションの開発では、逆のケースでした。

com.sun.jna.Library と com.sun.jna.Callback を使用すると、コールバック呼び出しから戻るときに常に VM がクラッシュしていました。

com.sun.jna.win32.StdCallLibrary および com.sun.jna.win32.StdCallLibrary.StdCallCallback に変更した後、問題は解決しました。

于 2011-11-03T18:18:33.983 に答える