2017-01-06 4 views
0

OS : 우분투 16.04
JNA : 4.2.x를
JDK는 : 내가 얻으려고 1.8.0u111JNA - 우분투 - XGetInputFocus

현재 자바 FX 애플리케이션에 programmaticaly 창을 집중했다.

if (Platform.isLinux()) { 
    final X11 x11 = X11.INSTANCE; 
    final XLib xlib = XLib.INSTANCE; 

    X11.Display display = x11.XOpenDisplay(null); 
    X11.Window window = new X11.Window(); 
    Pointer pointer = Pointer.NULL; 

    xlib.XGetInputFocus(display, window, pointer); // << ERROR 
    X11.XTextProperty name = new X11.XTextProperty(); 
    x11.XGetWMName(display, window, name); 
    System.out.println(name.toString()); 
} 

public interface XLib extends StdCallLibrary { 

    XLib INSTANCE = (XLib) Native.loadLibrary("/usr/lib/x86_64-linux-gnu/libX11.so", XLib.class); 

    int XGetInputFocus(X11.Display display, X11.Window focus_return, Pointer revert_to_return); 
} 

는하지만 일을하고이 예외가 발생하지 않습니다

java.lang.IllegalArgumentException: Unrecognized calling convention: 63 
at com.sun.jna.Native.invokeInt(Native Method) 
at com.sun.jna.Function.invoke(Function.java:390) 
at com.sun.jna.Function.invoke(Function.java:323) 
at com.sun.jna.Library$Handler.invoke(Library.java:236) 
at com.sun.proxy.$Proxy1.XGetInputFocus(Unknown Source) 
at application.Main.start(Main.java:33) 

이 라인은 정확을?

XLib INSTANCE = (XLib) Native.loadLibrary("/usr/lib/x86_64-linux-gnu/libX11.so", XLib.class); 

내가 JNA (전 4.1.x)의 이전 버전에서 테스트하고 오류에 대해 변경 : -Djna.debug_load=true

Looking in classpath from [email protected] for /com/sun/jna/linux-x86-64/libjnidispatch.so 
Found library resource at jar:file:/home/puglic/eclipse/jna-4.2.2.jar!/com/sun/jna/linux-x86-64/libjnidispatch.so 
Looking for library 'X11' 
Adding paths from jna.library.path: null 
Trying libX11.so 
Found library 'X11' at libX11.so 
Looking for library 'X11' 
Adding paths from jna.library.path: null 
Trying libX11.so 
Found library 'X11' at libX11.so 
java.lang.IllegalArgumentException: Unrecognized calling convention: 63 
+0

로드되는 JNA Java 코드와 JNA 네이티브 라이브러리가 일치하지 않는 것 같습니다. '-Djna.nosys = true'로 실행 해보십시오. JN의 시스템 설치 버전은 무시되고 jna.jar에 포함 된 버전의 압축이 풀립니다. – technomage

+0

@technomage 작동하지 않는 것 같습니다. VM args에'-Djna.nosys = true'를 추가하고, jna.jar을 압축 해제하고,'System.load'를 통해'libjnidispatch.so'를로드했습니다. 나는 같은 예외를 가지고있다. – puglic

답변

0

Unrecognized calling convention: 1 

디버그 로그 XLib 정의에서 0을 사용합니다.은 32 비트 Windows 시스템에서만 의미가 있습니다. 단순히 Library이어야하며 JNA contrib 정의 버전에서 파생됩니다.

기본적으로 존재하지 않는 호출 규칙을 요구하고 있습니다.

+0

잘 찾아 냈습니다! 이제는 Java Runtime Environment에서 치명적인 오류가 발견되었습니다. C [libX11.so.6 + 0x22e47] XGetInputFocus + 0x57' JVM 오류가 발생했습니다. JNA와 관련이 있습니까? 또는 JVM 문제점입니까? – puglic

+0

잘못된 인수 또는 잘못 매핑 된 인수 때문일 가능성이 큽니다. 특히,'Window'가 아니라 두 번째 인수로서'Window'에 대한 포인터가 필요합니다. – technomage

+0

X11 라이브러리 매핑에는'WindowByReference' 유형이 포함되어 있다고 생각합니다. – technomage