使用JNA在java中使用Windows的CreateEvent()函数

时间:2016-01-12 00:27:19

标签: java winapi jna

我编写了以下类来包装win32事件对象的创建

import com.sun.jna.*;
import com.sun.jna.Native;
import com.sun.jna.platform.win32.*;
import com.sun.jna.platform.win32.Kernel32;

/**
 * Wraps a (newly-created) native win32 event object and allows you to signal it.
 * 
 * The created event object is manual-reset and is initially un-set.
 */
public final class Win32Event
{
    private static final Kernel32 INSTANCE = (Kernel32) Native.loadLibrary("Kernel32", Kernel32.class);

    private WinNT.HANDLE m_handle = null;

    public Win32Event(String in_eventName)
    {
        assert null != in_eventName;

        m_handle = INSTANCE.CreateEvent(null, true, false, in_eventName);

        assert !Pointer.NULL.equals(m_handle.getPointer());
    }

    public void signal()
    {
        assert isValid();

        INSTANCE.SetEvent(m_handle);
    }

    /**
     * @return True if the event handle hasn't been freed with free().
     */
    public boolean isValid()
    {
        return null != m_handle;
    }

    /**
     * Frees the wrapped event handle. This must be done to prevent handle leaks.
     */
    public void free()
    {
        if (isValid())
        {
            INSTANCE.CloseHandle(m_handle);

            m_handle = null;
        }
    }

    @Override
    protected void finalize()
    {
        free();
    }
}

我在Windows 7机器上使用jna 3.3,当我尝试创建此类的实例时,我得到以下堆栈跟踪。

  

线程“main”中的异常java.lang.UnsatisfiedLinkError:错误   查找函数'CreateEvent':指定的过程不能   被发现。

     

at com.sun.jna.Function。(Function.java:179)at   com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:347)at   com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:327)at   com.sun.jna.Library $ Handler.invoke(Library.java:203)at   $ Proxy0.CreateEvent(未知来源)at   Win32Event。(Win32Event.java:23)

我是JNA的新手,不知道我做错了什么。

1 个答案:

答案 0 :(得分:1)

我通过使用我在顶部定义的静态变量更改代码来执行INSTANCE.[method],而不是使用kernel32.INSTANCE.[method]来修复它。

我通过查看kernel32的定义并注意到它具有静态INSTANCE变量来解决这个问题。