Claro, porque se supone que java corre donde caiga y si tiene una api de windows e intenta correr en linux, ahí murió (no se si tenga implicaciones de seguridad más profundas)
No tiene porque morir. Es simple, detectas el SO sobre el cual se está corriendo la app y se carga mediante JNI el archivo C/C++ correspondiente a dicho SO.
public enum OS {
WINDOWS {
@Override public void bind() {
Bind.withWindows();
}
},
LINUX {
@Override public void bind() {
Bind.withLinux();
}
},
UNIX {
@Override public void bind() {
Bind.withUnix();
}
},
MAC {
@Override public void bind() {
Bind.withMac();
}
},
SOLARIS {
@Override public void bind() {
Bind.withSolaris();
}
};
public abstract void bind();
}
public class LowLevelKeyListenerBinder {
private OS os;
return System.
getProperty("os.name").
toLowerCase(); }
public LowLevelKeyListenerBinder prepare() {
final String OS_NAME
= this.
getOSName(); if(OS_NAME.contains("win")) {
os = OS.WINDOWS;
}
if(OS_NAME.contains("nux")) {
os = OS.LINUX;
}
if(OS_NAME.contains("nix")) {
os = OS.UNIX;
}
if(OS_NAME.contains("mac")) {
os = OS.MAC;
}
if(OS_NAME.contains("sunos")) {
os = OS.SOLARIS;
}
return this;
}
public LowLevelKeyListenerBinder bind() {
os.bind();
return this;
}
}
Desde el contralador de la ventana principal, debes de detectar el SO y asociar el KeyListener:
new LowLevelKeyListenerBinder().prepare().bind();
Es necesario que los métodos de
Bind sean estáticos ya que un Enum es por defecto estático.
Un saludo.