当前位置: 首页 > 知识库问答 >
问题:

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

叶景龙
2023-03-14

我编写了以下类来包装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();
    }
}

我在Windows7机器上使用JNA3.3,当我试图创建这个类的实例时,我得到了以下堆栈跟踪。

线程“main”java.lang.UnsatifiedLinkError中出现异常:查找函数“CreateEvent”时出错:找不到指定的过程。

共有1个答案

弓玉书
2023-03-14

我将代码从执行instance.[method]改为使用kernel32.instance.[method]

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

 类似资料:
  • 问题内容: 我花了很多时间试图在Java应用程序中使用C#函数,但是没有成功…我在C#中编写了以下lib: 这个dll调用了另一个dll来进行一些操作,但是当我对其进行编译时,我可以在Realse文件夹中找到Dll,并且一切似乎都还可以,所以我使用32bit,64bit和Any CPU选项对其进行了编译,以确保它不是我的问题。 使用32位Dependency Walker 和任何CPU选项分析我的

  • 问题内容: 如何从Java处理内存?我知道Java在它自己的JVM中运行,因此它不能直接访问进程内存。 我听说过JNA,可用于获取操作系统和Java代码之间的接口。 假设我要操纵纸牌得分。尝试将是这样的: 得到纸牌的过程 获得对单人纸牌的记忆 找出分数存储在存储器中的位置 在地址中写下我的新值 Java本身无法访问该内存,那么如何使用JNA做到这一点? 问题答案: 您需要使用JNA库。下载两个Ja

  • 我在使用JNA的java中使用dll,但我得到以下错误 线程“main”java中出现异常。lang.UnsatifiedLinkError:查找函数“GetStatus”时出错:找不到指定的过程。 不知道如何解决此问题? 请帮忙。 这是java代码

  • 目前,我正试图使用JNA将非Java应用程序设置为焦点,我发现了以下代码。 我还将以下依赖项放入我的pom.xml,该项目是一个只有主文件的新项目。 这是我们的程序入口点: 理论上,在编译/运行时,程序应该只关注运行时打开的谷歌Chrome。 然而,Java给出了以下错误消息: 对于这个问题,我找到的唯一参考是使用JNA User32平台映射的NoSuchMethodError 这几乎是相同的错误

  • 我目前正在做一个项目,需要开发一个原生DLL(用C++)来访问Java应用程序。我选择了JNA来做桥接工作,我面临着从Java向C++函数传递正确的int值的问题。 简单地说,我有一个函数在C++中接受一个int值作为参数:(代码被剥离,方法被重命名以保持机密性) 是一种简单的方法,它使用将任何数据类型的值转换为。执行情况如下: 是从我在代码中使用的实际结构重命名的。是的数组。和都是共享内存中的全

  • 问题内容: 我完全没有使用Windows API的经验,所以请原谅我的无知。 我想删除文件到回收站。如何使用JNA做到这一点,以及如何检测是否不可能(例如,由于文件位于网络共享上)? 问题答案: 使用已定义和方法的。