Kushal
Kushal

Reputation: 3178

Using Windows API call in Java using "native"

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 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.

Upvotes: 0

Views: 2965

Answers (4)

mP.
mP.

Reputation: 18266

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.

Upvotes: 1

David Heffernan
David Heffernan

Reputation: 613612

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

Upvotes: 0

ANooBee
ANooBee

Reputation: 195

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.

Upvotes: 0

Corbin
Corbin

Reputation: 33467

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).

Upvotes: 2

Related Questions