JNA - Нарушение прав доступа, прекращение работы JVM - PullRequest
3 голосов
/ 31 июля 2009

Я вызываю 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]

Я много читал (и здесь), но не могу найти проблему. Я бегу JRE Java6. У меня 1,5 ГБ памяти на моей машине. DLL не используется никаким другим процессом (нет проблем с параллелизмом).

Спасибо, Azriel

Ответы [ 2 ]

4 голосов
/ 19 августа 2009

Попробуйте написать свой 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 голосов
/ 03 ноября 2011

В моем случае при разработке телекоммуникационного приложения, использующего Win32 DLL, это был противоположный случай.

При использовании com.sun.jna.Library и com.sun.jna.Callback при сбое обратного вызова всегда происходил сбой виртуальной машины.

После изменения на com.sun.jna.win32.StdCallLibrary и com.sun.jna.win32.StdCallLibrary.StdCallCallback проблема была решена.

...