使用“本机”在Java中使用Windows API调用

时间:2011-09-04 21:56:26

标签: java winapi native

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

这是我用来调用Java中的Win API方法以获取当前Windows用户名和本机Windows MessageBox的代码,但我得到的UnsatisfiedLinkError表示我的代码无法找到我想要调用的native方法。

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作为跨平台语言的原因,但我需要开发一个用Java开发的项目,用Java开发。

感谢。

更新

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

4 个答案:

答案 0 :(得分:2)

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

GetUserName函数有两个参数:LPTSTR和LPDWORD。 Java可能无法处理充当TCHAR数组的StringBuffer。

另外,为什么还要使用Windows API呢? Java可能会获得用户的登录名(快速google说:System.getProperty(“user.name”)),而Swing可以创建一个消息框(即使是一个看起来像Windows的消息框)。

答案 1 :(得分:1)

您是否尝试过https://github.com/twall/jna。我听过很多好东西,并且应该通过许多方便和简化使jni变得更容易。

答案 2 :(得分:0)

你有一个-Djava.library.path VM arg设置了DLL的路径吗?或者,您可以在系统路径中使用它。

答案 3 :(得分:0)

错误是因为没有MessageBox。你可能意味着MessageBoxA。