문제

콜백 functio 객체를 전달하여 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은 다른 프로세스에서 사용되지 않습니다 (동시성 문제 없음).

고마워, 아즈 리엘

도움이 되었습니까?

해결책

com.sun.jna.callback 대신 com.sun.jna.win32.stdcalllibrary.stdcallcallback으로 mycallback을 작성하십시오.

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

안부, 엠마누엘 지라드

다른 팁

제 경우에는 Win32 DLL을 사용하는 통신 애플리케이션을 개발하는 것이 반대입니다.

com.sun.jna.library 및 com.sun.jna.callback 사용 콜백 호출에서 돌아올 때 항상 VM이 충돌했습니다.

com.sun.jna.win32.stdcalllibrary 및 com.sun.jna.win32.stdcalllibrary.stdcallcallcall로 변경 한 후 문제가 해결되었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top