【问题标题】:Using Windows API call in Java using "native"使用“本机”在 Java 中使用 Windows API 调用
【发布时间】:2011-09-04 21:56:26
【问题描述】:

我已尝试通过引用可能的重复项来解决此问题,但它们似乎都没有帮助。

这是我用来在 Java 中调用 Win API 方法以获取当前 Windows 用户名和本机 Windows 消息框的代码,但我收到 UnsatisfiedLinkError 表示我的代码无法找到 @ 987654322@ 我正在尝试调用的方法。

public class TestNative
{
    public static void main(String[] args)
    {
        long[] buffer= { 128 };
        StringBuffer username = new StringBuffer((int)buffer[0]);
        GetUserNameA(username,buffer);
        System.out.println("Current User : "+username);
        MessageBoxA(0,"UserName : "+username,"Box from Java",0);
    }
    /** @dll.import("ADVAPI32") */
    static native void GetUserNameA(StringBuffer username,long[] buffer);
    /** @dll.import("USER32") */
    private static native int MessageBoxA(int h,String txt,String title,int style);
}

在 Java 中调用本机 Windows 方法的可能(相对简单)解决方案是什么。我意识到它会扼杀 Java 作为跨平台语言的原因,但我需要为 Windows 开发一个项目,用 Java 开发。

谢谢。

更新

正如 David Heffernan 建议的那样,我尝试将 MessageBox 的方法签名更改为 MessageBoxA,但仍然无法正常工作。

【问题讨论】:

    标签: java winapi native


    【解决方案1】:

    我猜这与签名不完全匹配有关。

    GetUserName 函数采用两个参数:LPTSTR 和 LPDWORD。 Java 可能不会为您处理充当 TCHAR 数组的 StringBuffer。

    另外,为什么还要为此使用 Windows API? Java 可能可以获取用户的登录名(谷歌快速说:System.getProperty("user.name")),Swing 可以制作一个消息框(甚至是一个看起来像 Windows 的消息框)。

    【讨论】:

    • 好吧,获取用户名不是我要开发的应用程序的目的,这只是为了测试我是否可以通过上述方法使用native调用API函数。
    • 啊,我不应该认为这是你的最终目标。我仍然怀疑不完全匹配的签名是问题所在。我的兴趣已经被激起了,所以我要去尝试一下。
    • 谷歌搜索后,除非它是新功能,否则我怀疑您必须编写包装代码。在研究了 JNI 的工作原理之后,我认为没有库中一些 Java 感知代码的情况下,没有办法直接调用 DLL 中的函数。
    【解决方案2】:

    你试过https://github.com/twall/jna。我听说过一些好事,它应该通过许多便利和简化让 jni 变得更容易。

    【讨论】:

      【解决方案3】:

      您是否设置了带有 DLL 路径的 -Djava.library.path 虚拟机参数?或者,您可以将它放在系统 PATH 中。

      【讨论】:

        【解决方案4】:

        错误是因为没有MessageBox。您大概是指 MessageBoxA。

        【讨论】:

        • 我尝试将方法签名更改为MessageBoxA,但仍然出现同样的错误。
        猜你喜欢
        • 1970-01-01
        • 2011-01-30
        • 1970-01-01
        • 1970-01-01
        • 2011-09-13
        • 1970-01-01
        • 2017-07-08
        • 2020-05-24
        • 1970-01-01
        相关资源
        最近更新 更多