开发者

Using Windows API call in Java using "native"

开发者 https://www.devze.com 2023-04-02 04:15 出处:网络
I\'ve tried to solve this issue by referring possible duplicates but none of them seem to be helpful.

I've tried to solve this issue by referring possible duplicates but none of them seem to be helpful.

Here's a code that I'm using to call Win API methods in Java to get current Windows User Name, and a native Windows MessageBox, but I'm getting UnsatisfiedLinkError that says that my code is unable to locate the native method I'm trying to call.

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);
}

What can be my possible (relatively simple) solution to call native Windows methods in Java. I realize that开发者_C百科 it will kill the very reason of Java being a cross-platform language, but I need to work on a project for Windows, to be developed in Java.

Thanks.

Update

As David Heffernan suggested, I've tried changing the method signature of MessageBox to MessageBoxA, but still it's not working.


I would guess it's related to the signatures not matching completely.

The GetUserName function takes two parameters: a LPTSTR and a LPDWORD. Java will likely not handle the StringBuffer acting as a TCHAR array for you.

Also, why bother using the Windows API for this? Java can probably get the user's logon name (quick google says: System.getProperty("user.name")), and Swing can make a message box (even one that looks like a Windows one).


Have you tried https://github.com/twall/jna. I have heard good things and its supposed to make jni that bit easier with many conveniences and simplifications.


Do you have a -Djava.library.path VM arg set with the path to your DLL's? Alternatively, you can have it in your system PATH.


The error is because there is no MessageBox. You presumably mean MessageBoxA.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号