2011-01-24 2 views
0

Я пытаюсь вызвать 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"); 
    } 
}; 

}

+0

Успешно ли вы получаете доступ к другим функциям через JNA? Можете ли вы привести пример того, как вы инициализируете свой экземпляр? –

ответ

0

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

+0

JNA обычно обрабатывает эти альтернативные сопоставления. –

+0

Я не вижу ошибку сейчас, когда я меняю заглушку на OpenEventA или OpenEventW. Но теперь метод возвращает null для каждого вызова. – vinzy

+0

Доступны ли глобальные события в java или нет JVM? – vinzy

0

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

Смежные вопросы