문제
콜백 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로 변경 한 후 문제가 해결되었습니다.
제휴하지 않습니다 StackOverflow