有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

将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) 个答案

  1. # 1 楼答案

    无效内存访问错误表示没有为传递给函数的任何指针分配本机内存。因为字符串和布尔值不是问题,所以您知道传递HWND不是正确的映射

    在没有看到C API的情况下,我只能猜测,但根据您对它的描述,它需要一个IntPtr的本机地址作为整数(或者int或者long,取决于32位或者64位)

    我怀疑您需要将接口映射更改为longint,并将Pointer.nativeValue(HWND.getPointer())传递给它。(或者简化代码以绕过HWND存储,只需最初使用Pointer.nativeValue(Native.getComponentPointer(jFrame))获取整数。)