3

我正在调用一个 DLL,并将一个回调函数对象传递给它。其中一项功能是简单打印。然后,我有一个 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(是 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.Callback 而不是 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);
  }

问候, 伊曼纽尔·吉拉德

于 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 回答