2017-01-23 10 views
0

OS:Ubuntuの16.04
JNA:4.2.2
JDK:1.8.0u111JNA - JVM致命的なエラー - XGetInputFocus - Ubuntuの

私はJavaFXアプリケーションでJNAを使用して、現在フォーカスされたウィンドウを取得しようとしていますUbuntuで動作します。私の目標を達成するために

、私はそのように、より正確には、機能XGetInputFocusをX11 APIを使用しています:

if (Platform.isLinux()) { 

    System.err.println("Linux platform"); 

    final X11 x11 = X11.INSTANCE; 
    final XLib xlib = XLib.INSTANCE; 

    X11.Display display = x11.XOpenDisplay(null); 

    //X11.Window window = new X11.Window(); 
    X11.WindowByReference winRef = new X11.WindowByReference(); 

    Pointer pointer = Pointer.NULL; 

    xlib.XGetInputFocus(display, winRef, pointer); 

    /*X11.XTextProperty name = new X11.XTextProperty(); 
    x11.XGetWMName(display, window, name); 
    System.out.println(name.toString());*/ 
} 

-

public interface XLib extends X11 { 
    XLib INSTANCE = (XLib) Native.loadLibrary("X11", XLib.class); 
    //void XGetInputFocus(X11.Display display, X11.Window focus_return, Pointer revert_to_return); 
    void XGetInputFocus(X11.Display display, X11.WindowByReference focus_return, Pointer revert_to_return); 
} 

は残念ながら、私は私が試した、以下の例外が発生しましたX11.WindowByReferenceX11.Windowにはパラメータがありますが、何も変更されません。例外は同じです。

Linux platform 
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 
# 
# A fatal error has been detected by the Java Runtime Environment: 
# 
# SIGSEGV (0xb) at pc=0x00007f4063178e47, pid=21693, tid=0x00007f405423a700 
# 
# JRE version: Java(TM) SE Runtime Environment (8.0_111-b14) (build 1.8.0_111-b14) 
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.111-b14 mixed mode linux-amd64 compressed oops) 
# Problematic frame: 
# C [libX11.so.6+0x22e47] XGetInputFocus+0x57 

また、大きなエラーファイルhs_err_pid21693.logが生成されます。私たちはラインのこの種を見つけることができる場所:

... 
Internal exceptions (10 events): 
Event: 0,223 Thread 0x00007f213000a000 Exception <a 'java/lang/NoSuchFieldError': method resolution failed> (0x00000000d7b0ded8) thrown at [/HUDSON3/workspace/8-2-build-linux-amd64/jdk8u111/7883/hotspot/src/share/vm/prims/methodHandles.cpp, line 1146] 
Event: 0,262 Thread 0x00007f213000a000 Exception <a 'java/security/PrivilegedActionException'> (0x00000000d7b98008) thrown at [/HUDSON3/workspace/8-2-build-linux-amd64/jdk8u111/7883/hotspot/src/share/vm/prims/jvm.cpp, line 1386] 
Event: 0,262 Thread 0x00007f213000a000 Exception <a 'java/security/PrivilegedActionException'> (0x00000000d7b98218) thrown at [/HUDSON3/workspace/8-2-build-linux-amd64/jdk8u111/7883/hotspot/src/share/vm/prims/jvm.cpp, line 1386] 
Event: 0,263 Thread 0x00007f213000a000 Exception <a 'java/security/PrivilegedActionException'> (0x00000000d7b9a7e8) thrown at [/HUDSON3/workspace/8-2-build-linux-amd64/jdk8u111/7883/hotspot/src/share/vm/prims/jvm.cpp, line 1386] 
Event: 0,263 Thread 0x00007f213000a000 Exception <a 'java/security/PrivilegedActionException'> (0x00000000d7b9a9f8) thrown at [/HUDSON3/workspace/8-2-build-linux-amd64/jdk8u111/7883/hotspot/src/share/vm/prims/jvm.cpp, line 1386] 
Event: 0,263 Thread 0x00007f213000a000 Exception <a 'java/lang/NullPointerException'> (0x00000000d7b9afd0) thrown at [/HUDSON3/workspace/8-2-build-linux-amd64/jdk8u111/7883/hotspot/src/share/vm/interpreter/linkResolver.cpp, line 1178] 
Event: 0,621 Thread 0x00007f21302c1800 Exception <a 'java/lang/NullPointerException'> (0x00000000d8349f68) thrown at [/HUDSON3/workspace/8-2-build-linux-amd64/jdk8u111/7883/hotspot/src/share/vm/interpreter/linkResolver.cpp, line 1178] 
Event: 0,621 Thread 0x00007f21302c1800 Exception <a 'java/lang/NullPointerException'> (0x00000000d8349f68) thrown at [/HUDSON3/workspace/8-2-build-linux-amd64/jdk8u111/7883/hotspot/src/share/vm/prims/jvm.cpp, line 1390] 
Event: 0,871 Thread 0x00007f21302c1800 Exception <a 'java/io/FileNotFoundException'> (0x00000000d87dc6d8) thrown at [/HUDSON3/workspace/8-2-build-linux-amd64/jdk8u111/7883/hotspot/src/share/vm/prims/jni.cpp, line 709] 
Event: 1,041 Thread 0x00007f21302c1800 Implicit null exception at 0x00007f212120d176 to 0x00007f212120d531 
... 
+0

「Pointer.NULL」と「null」は同等であることに注意してください。前者は、 'null'を使うとあいまいさや型の混乱を招くような状況でのみ提供されます。 – technomage

答えて

0

を私はXGetInputFocusはあなたの最後の引数としてNULLを渡すのオプションを与えるとは思いません。あなたは関数がrevert_to "return"値を書くことができる有効なメモリ位置のアドレスを渡す必要があります。

ヌルではなくNULLでないIntByReferenceオブジェクトを使用する必要があります。

+0

ありがとう、それは動作します!次に、ウィンドウ名を取得するために何をすべきですか? – puglic

+0

'x11.XGetWMName(display、winRef.getValue()、name);' 'name.value'は私にタイトルを与えます。しかし、Firefoxのような他のアプリでは、それは私に 'null'を与えます。私は間違ったことをしましたか? – puglic

+0

'XTextProperty *'引数に 'PointerByReference'を渡し、' '返された ''ポインタ値を使って新しい' XTextProperty'を初期化する必要があります。 – technomage