【问题标题】:JNA - Access Violation, JVM terminatsJNA - 访问冲突,JVM 终止
【发布时间】:2009-07-31 14:58:20
【问题描述】:

我正在调用一个 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),然后是“在 Start 从 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 未被任何其他进程使用(无并发问题)。

谢谢, 阿兹瑞尔

【问题讨论】:

  • 也许你的 DLL 的调用约定不是 StdCall?
  • 您应该“接受”答案(点击复选标记),而不是作为前缀回答。

标签: java crash jna


【解决方案1】:

尝试将您的 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);
  }

问候, 伊曼纽尔·吉拉德

【讨论】:

    【解决方案2】:

    在我开发使用 win32 dll 的电信应用程序时,情况正好相反。

    使用 com.sun.jna.Library 和 com.sun.jna.Callback 从回调调用返回时,VM 总是崩溃。

    改成com.sun.jna.win32.StdCallLibrary和com.sun.jna.win32.StdCallLibrary.StdCallCallback后问题解决了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-09
      • 1970-01-01
      • 2013-09-24
      • 2017-05-06
      • 2013-02-26
      • 2015-04-23
      • 2018-04-16
      相关资源
      最近更新 更多