Я пытаюсь вызвать OpenEvent
из kernel32.dll
с помощью ЮНА и завершается с ошибкойВызов OpenEvent терпит неудачу через ЮНА
java.lang.UnsatisfiedLinkError
: Ошибка отрываясь функции «OpenEvent»: Указанная процедура не может быть найден.
Моя декларация окурок выглядит следующим образом
public static native Pointer OpenEvent(int access, boolean inheritHandle, String name);
Может кто-то помочь мне определить проблему здесь?
- После внесения изменений, основанных на отзывах пользователей, я не получаю ошибку сейчас; но метод OpenEvent всегда возвращает null. Это код, который демонстрирует поведение
/** * Hello world! * */
импорт com.sun.jna.FromNativeContext; импорт com.sun.jna.Native; импорт com.sun.jna.Pointer; импорт com.sun.jna.PointerType;
public class App { статический { 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");
}
};
}
Успешно ли вы получаете доступ к другим функциям через JNA? Можете ли вы привести пример того, как вы инициализируете свой экземпляр? –