Сбой вызова OpenEvent через JNA - PullRequest
0 голосов
/ 24 января 2011

Я пытаюсь вызвать OpenEvent из kernel32.dll, используя JNA, и происходит сбой с ошибкой

java.lang.UnsatisfiedLinkError: ошибка при поиске функции 'OpenEvent': указанная процедура не может бытьнайдено.

Моя декларация окурка выглядит следующим образом

public static native Pointer OpenEvent(int access, boolean inheritHandle, String name);

Может ли кто-нибудь помочь мне определить проблему здесь?

- После внесения изменений на основе отзывов пользователейЯ не понимаю ошибку сейчас;но метод OpenEvent всегда возвращает ноль.Этот код демонстрирует поведение

/ ** * Hello world!* * /

import com.sun.jna.FromNativeContext;импорт com.sun.jna.Native;import com.sun.jna.Pointer;import com.sun.jna.PointerType;

открытый класс App {static {Native.register ("kernel32");}

public static native HANDLE OpenEventW(int access, boolean inheritHandle,
        String name);

public static native HANDLE CreateEventW(Pointer securityAttributes, 
        boolean manualReset, boolean initialState, String name);

public static native int GetLastError();

public static void main( String[] args )
{

    HANDLE i = CreateEventW(null,false,false,"Global\\testEvent");

    System.out.println("After create event:"+GetLastError());

    HANDLE j = OpenEventW(100000, false, "Global\\testEvent");

    System.out.println("After open event:"+GetLastError());


}

public static class HANDLE extends PointerType {
     public Object fromNative(Object nativeValue, FromNativeContext context) {
         Object o = super.fromNative(nativeValue, context);
         if (INVALID_HANDLE_VALUE.equals(o))
             return INVALID_HANDLE_VALUE;
         return o;
     }
 }

 static HANDLE INVALID_HANDLE_VALUE = new HANDLE() {
     { super.setPointer(Pointer.createConstant(-1)); }
     public void setPointer(Pointer p) {
         throw new UnsupportedOperationException("Immutable reference");
     }
 };

}

Ответы [ 2 ]

0 голосов
/ 08 июля 2011

Если вы отображаете напрямую в функцию OpenEventW без использования параметров, предоставляемых JNA, то вам необходимо явно отобразить строку Java String на собственный тип wchar_t *, используя WString, где вы в настоящее время используете String.В противном случае вы будете передавать недопустимые идентификаторы событий в собственную функцию, что, вероятно, приведет к сбою вызова.

0 голосов
/ 24 января 2011

Не знаю, что такое JNA или как он работает, но проблема, скорее всего, в том, что фактическая экспортируемая функция НЕ "OpenEvent". Это «OpenEventA» или «OpenEventW» в зависимости от того, хотите ли вы использовать вариант ASCII или Unicode. Я предполагаю, что строки Java являются Unicode, поэтому вы, скорее всего, захотите «OpenEventW».

...