使用 JNA java 中的 windows' CreateEvent() 函数
Using windows' CreateEvent() function from java using JNA
我编写了以下内容class 来包装 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,当我尝试创建此 class 的实例时,我得到以下堆栈跟踪。
Exception in thread "main" java.lang.UnsatisfiedLinkError: Error
looking up function 'CreateEvent': The specified procedure could not
be found.
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(Unknown Source) at
Win32Event.(Win32Event.java:23)
我是 JNA 的新手,不确定我做错了什么。
我通过更改代码来修复它,从使用我在顶部定义的静态变量执行 INSTANCE.[method]
改为使用 kernel32.INSTANCE.[method]
.
我通过查看 kernel32 的定义并注意到它有那个静态 INSTANCE 变量来解决这个问题。
我编写了以下内容class 来包装 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,当我尝试创建此 class 的实例时,我得到以下堆栈跟踪。
Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function 'CreateEvent': The specified procedure could not be found.
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(Unknown Source) at Win32Event.(Win32Event.java:23)
我是 JNA 的新手,不确定我做错了什么。
我通过更改代码来修复它,从使用我在顶部定义的静态变量执行 INSTANCE.[method]
改为使用 kernel32.INSTANCE.[method]
.
我通过查看 kernel32 的定义并注意到它有那个静态 INSTANCE 变量来解决这个问题。