【问题标题】:Calling OpenEvent fails through JNA通过 JNA 调用 OpenEvent 失败
【发布时间】:2011-01-24 17:30:18
【问题描述】:

我正在尝试使用 JNA 调用 kernel32.dllOpenEvent,但失败并出现错误

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

我的存根声明如下所示

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

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

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

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

导入 com.sun.jna.FromNativeContext; 导入 com.sun.jna.Native; 导入 com.sun.jna.Pointer; 导入com.sun.jna.PointerType;

公共类应用 { 静止的 { 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");
     }
 };

}

【问题讨论】:

  • 您是否通过JNA成功访问其他功能?您能否提供一个如何初始化实例的示例?

标签: java winapi jna


【解决方案1】:

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

【讨论】:

  • JNA 通常会处理这些备用映射。
  • 当我将存根更改为 OpenEventA 或 OpenEventW 时,我现在看不到错误。但现在该方法似乎在每次调用时都返回 null。
  • 全局事件可以在 java 中访问还是 JVM 从来没有看到它?
  • 如果更改函数名有帮助,​​我怀疑您没有正确使用 Windows 特定的 StdCallLibrary。此外,您可能需要 HANDLE 返回类型而不是指针。 JNA contrib 部分中有一个 Kernel32 库,您可能希望查看它以供参考(或扩展)。
  • 我更新了我的代码以使用 HANDLE 代替指针,但仍然得到相同的结果(null)。我已经更新了我在问题描述中使用的示例代码。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2011-10-11
    • 2014-11-19
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多