通过JNA调用OpenEvent失败

时间:2011-01-24 17:30:18

标签: java winapi jna

我正在尝试使用JNA调用OpenEvent kernel32.dll,但失败并显示错误

  

java.lang.UnsatisfiedLinkError:查找函数'OpenEvent'时出错:找不到指定的过程。

我的存根声明如下所示

public static native Pointer OpenEvent(int access, boolean inheritHandle, String name);

有人可以帮我在这里找出问题吗?

- 根据用户反馈进行修改后,我现在没有收到错误;但是OpenEvent方法总是返回null。这是演示行为的代码

/ **  * 你好,世界!  *  * /

import com.sun.jna.FromNativeContext; import com.sun.jna.Native; import com.sun.jna.Pointer; import com.sun.jna.PointerType;

公共类App {     静态的 {         Native.register( “KERNEL32”);     }

public static native HANDLE OpenEventW(int access, boolean inheritHandle,
        String name);

public static native HANDLE CreateEventW(Pointer securityAttributes, 
        boolean manualReset, boolean initialState, String name);

public static native int GetLastError();

public static void main( String[] args )
{

    HANDLE i = CreateEventW(null,false,false,"Global\\testEvent");

    System.out.println("After create event:"+GetLastError());

    HANDLE j = OpenEventW(100000, false, "Global\\testEvent");

    System.out.println("After open event:"+GetLastError());


}

public static class HANDLE extends PointerType {
     public Object fromNative(Object nativeValue, FromNativeContext context) {
         Object o = super.fromNative(nativeValue, context);
         if (INVALID_HANDLE_VALUE.equals(o))
             return INVALID_HANDLE_VALUE;
         return o;
     }
 }

 static HANDLE INVALID_HANDLE_VALUE = new HANDLE() {
     { super.setPointer(Pointer.createConstant(-1)); }
     public void setPointer(Pointer p) {
         throw new UnsupportedOperationException("Immutable reference");
     }
 };

}

2 个答案:

答案 0 :(得分:0)

不知道JNA是什么或它是如何工作的,但问题可能是实际导出的函数不是“OpenEvent”。它是“OpenEventA”或“OpenEventW”,具体取决于您是否需要ASCII或Unicode变体。我假设Java字符串是Unicode,所以你很可能想要“OpenEventW”。

答案 1 :(得分:0)

如果在不使用JNA提供的选项的情况下直接映射到OpenEventW函数,则需要使用当前使用String的WString将Java String显式映射到本机wchar_t *类型。否则,您将把无效的事件ID传递给本机函数,这可能会导致调用失败。