将本机窗口句柄传递给Java中的DLL

时间:2016-03-01 12:31:06

标签: java canvas jna

为了解释这个问题,我想最好解释(简化)我想要做的事情。

有一个设备(相机)。此设备的API由本机DLL提供。此DLL中的一个函数需要一个Native Window Handle来直接在应用程序中绘制捕获的图像。使用C#的解决方案是将PictureBox.Handle传递给此函数。但是在Java中,绘图组件是awt.Canvas。此问题的早期实现是获取此Canvas的对等方,自JDK 1.1以来已弃用。此外,我不知道这个apporach是否一直有效。因此,他们有两个问题:

  1. 这种弃用的方法真的有效吗?

  2. 是否有其他可能的解决办法将窗口句柄传递给DLL?

  3. 这是DLL中函数的签名:

    int draw_func(..., const void* window,...);
    

    以前这个问题是如何解决的(或者可能不是):

    long lhwnd = ((sun.awt.windows.WComponentPeer)._canvasPictureBox.getPeer()).getHWnd();
    
    Pointer HWndPtr = new Pointer(lhwnd );
    

1 个答案:

答案 0 :(得分:2)

JNA提供了一种方法来获取组件的本地对等体Native.getComponentPointer(),您可以使用该方法从JNA的HANDLE初始化platform.jar对象或直接传入。