将HWND从java程序传递到C库
我的任务是将C#Windows窗体GUI转换为Java Swing GUI。我必须使用用C编写的同一个库。库中的一个函数需要窗口的本机句柄才能将C程序链接到窗口。在C#代码中,本机句柄的使用相当简单,一个Intptr
被传递给函数。在java中,情况就不同了。我找到了一种使用JNA(Java本机访问)和HWND
本机句柄表示获取窗口句柄的方法。问题是,当我使用HWND
给句柄时,每次都会弹出一个无效内存访问异常。这是我正在使用的代码
主要类别:
public class main {
public static void main(String[] args) {
JFrame jFrame = new JFrame();
jFrame.setSize(5000,5000);
jFrame.setVisible(true);
final HWND ptrRef = new HWND(Native.getComponentPointer(jFrame));
CLibrary cl = CLibrary.INSTANCE;
System.out.println("Handle: "+ptrRef);
String sPath = "C:\\Users\\markm\\IdeaProjects\\JFrameHandle\\Release";
cl.clStart(ptrRef, sPath, true);
}
}
CLibrary接口:
public interface CLibrary extends Library {
Clibrary INSTANCE = (CLibrary) Native.loadLibrary("C:\\Users\\markm\\IdeaProjects\\JFrameHandle\\Release\\clibrary",CLibrary.class);
void clStart(HWND parent, String libraryPath, boolean hidePanel);
}
不幸的是,我没有访问C代码的权限,因为我只有。dll文件,但在我能够访问该代码之前,我需要知道我是否做错了什么。如果有人能给我指出如何使用窗口句柄的正确方向,或者有一种通过另一端的JNI传递句柄的方法,请发表评论,我可以使用我能得到的所有帮助
提前谢谢
# 1 楼答案
无效内存访问错误表示没有为传递给函数的任何指针分配本机内存。因为字符串和布尔值不是问题,所以您知道传递
HWND
不是正确的映射在没有看到C API的情况下,我只能猜测,但根据您对它的描述,它需要一个
IntPtr
的本机地址作为整数(或者int
或者long
,取决于32位或者64位)我怀疑您需要将接口映射更改为
long
或int
,并将Pointer.nativeValue(HWND.getPointer())
传递给它。(或者简化代码以绕过HWND
存储,只需最初使用Pointer.nativeValue(Native.getComponentPointer(jFrame))
获取整数。)