Использование вызова Windows API в Java с использованием "native" - PullRequest
0 голосов
/ 05 сентября 2011

Я пытался решить эту проблему, ссылаясь на возможные дубликаты, но ни один из них, похоже, не помог.

Вот код, который я использую для вызова методов Win API в Java, чтобы получить текущее имя пользователя 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);
}

Что может быть моим возможным (относительно простым) решением для вызова нативных методов Windows в Java. Я понимаю, что это убьет саму причину того, что Java является кроссплатформенным языком, но мне нужно поработать над проектом для Windows, который будет разработан на Java.

Спасибо.

Обновление

Как предположил Дэвид Хеффернан, я попытался изменить сигнатуру метода с MessageBox на MessageBoxA, но все равно он не работает.

Ответы [ 4 ]

2 голосов
/ 05 сентября 2011

Я думаю, это связано с тем, что подписи не совпадают полностью.

Функция GetUserName принимает два параметра: LPTSTR и LPDWORD.Java, вероятно, не будет обрабатывать StringBuffer, выступающий в качестве массива TCHAR для вас.

Кроме того, зачем использовать для этого Windows API?Java, вероятно, может получить имя пользователя для входа в систему (быстрый Google говорит: System.getProperty ("user.name")), а Swing может создать окно сообщения (даже такое, которое выглядит как Windows).

1 голос
/ 05 сентября 2011

Вы пробовали https://github.com/twall/jna. Я слышал хорошие вещи, и это должно облегчить jni со многими удобствами и упрощениями.

0 голосов
/ 05 сентября 2011

Ошибка в том, что нет MessageBox.Вы, вероятно, имеете в виду MessageBoxA.

0 голосов
/ 05 сентября 2011

У вас есть аргумент -Djava.library.path VM с указанием пути к вашей DLL? Кроме того, вы можете иметь его в вашей системе PATH.

...