Thank you Joel I did not realize it was all related to native library loading, I can help narrow down the issue:
libawt and libmawt are supposed to get loaded by the OpenJDK run-time during
java.awt.Toolkit.getDefaultToolkit()
when running on a -Djava.awt.headless=false platform
libjawt has to get loaded manually for OpenJDK 7 after libawt and libmawt is initialized before the symbols are available to libnativewindow_awt.so
Inside JogAmp we call Toolkit.getDefaultToolkit() and load jawt manually inside the JAWTJNILibLoader's static constructor
we use JAWTJNILibLoader inside JAWTUtil's static constructor.
we use JAWTUtil during NativeWindowFactory static constructor using reflection:
http://jogamp.org/git/?p=jogl.git;a=blob;f=src/nativewindow/classes/jogamp/nativewindow/jawt/JAWTUtil.java#l293http://jogamp.org/git/?p=jogl.git;a=blob;f=src/nativewindow/classes/jogamp/nativewindow/jawt/JAWTJNILibLoader.java#l50http://jogamp.org/git/?p=jogl.git;a=blob;f=src/nativewindow/classes/javax/media/nativewindow/NativeWindowFactory.javalibnativewindow_awt is then finally loaded by jogamp when NativeWindowFactory has detected that it is running on a "headfull" awt platform.
JAWTUtil and JAWTJNILibLoader debug output can be enabled using: -Dnativewindow.debug.JAWT=true
NativeWindowFactory debug out is enabled using -Dnativewindow.debug=true
i compared the library load order order using a patched version of avian and jamvm that prints when System.loadLibrary is called to spot the differences in the static initialization.
xranby@xranby-ESPRIMO-P7935:~/jamvm$ git diff
diff --git a/src/os/linux/os.c b/src/os/linux/os.c
index 2eb881b..e4bf2f3 100644
--- a/src/os/linux/os.c
+++ b/src/os/linux/os.c
@@ -62,6 +62,7 @@ char *nativeLibPath() {
}
void *nativeLibOpen(char *path) {
+ fprintf(stderr, "open %s \n", path);
return dlopen(path, RTLD_LAZY);
}
++++++++++++++++++++++++++++++++++++++++++++++++++
xranby@xranby-ESPRIMO-P7935:~/avian$ git diff
diff --git a/src/vm/system/posix.cpp b/src/vm/system/posix.cpp
index b2531ff..d2c4660 100644
--- a/src/vm/system/posix.cpp
+++ b/src/vm/system/posix.cpp
@@ -877,12 +877,13 @@ class MySystem: public System {
if (isMain) {
pathOfExecutable(this, &name, &nameLength);
}
+ fprintf(stderr, "open %s \n", name);
void* p = dlopen(name, RTLD_LAZY | RTLD_LOCAL);
if (p) {
- if (Verbose) {
+// if (Verbose) {
fprintf(stderr, "open %s as %p\n", name, p);
- }
+// }
char* n;
if (name) {
++++++++++++++++++++++++++++++++++++++++++++++++++
Test output:
java -jamvm-git -Dnativewindow.debug=true -Dnativewindow.debug.JAWT=true -cp jogl-all.jar:gluegen-rt.jar com.jogamp.newt.opengl.GLWindow
Library load order using jamvm:
OK Test output (stack traces from debug output code):
...
Implementation Commit: ccfc9b529b1dbd6003a62cb4215e2cdaeb8c37fd
-----------------------------------------------------------------------------------------------------
main - Info: NativeWindowFactory.<init>
main - NativeWindowFactory.initSingleton()
JAWTUtil initialization (JAWT/JNI/...
open /usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/libawt.so
open /usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/xawt/libmawt.so
open /usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/libjawt.so
open /tmp/jogamp_0000/file_cache/jln3514050511337699936/jln4624328718319207679/libnativewindow_awt.so
JAWTUtil.getJAWT(tryOffscreenLayer false, tryOnscreen true)
JAWTUtil: Has sun.awt.SunToolkit.awtLock/awtUnlock true
JAWTUtil: Has Java2D true
JAWTUtil: Is headless false
JAWTUtil: AWT Desktop hints 1
JAWTUtil: OffscreenLayer Supported: false - Required false
X11Util.initSingleton()
open /tmp/jogamp_0000/file_cache/jln3514050511337699936/jln4624328718319207679/libnativewindow_x11.so
Info: NativeWindow native init passed
X11Util.initSingleton(): OK true],
X11 Display(NULL) <:0>,
XSynchronize Enabled: false,
X11_EXTENSION_ATIFGLRXDRI false,
X11_EXTENSION_ATIFGLEXTENSION false,
requiresToolkitLock true,
hasThreadingIssues false,
markAllDisplaysUnclosable false
NativeWindowFactory.registerFactory() interface javax.media.nativewindow.NativeWindow -> jogamp.nativewindow.NativeWindowFactoryImpl@982e9698
NativeWindowFactory.registerFactory() class java.awt.Component -> jogamp.nativewindow.NativeWindowFactoryImpl@982e9698
NativeWindowFactory requiresToolkitLock true, desktopHasThreadingIssues false
NativeWindowFactory isAWTAvailable true, defaultFactory jogamp.nativewindow.NativeWindowFactoryImpl@982e9698
main - Info: GraphicsConfigurationFactory.<init>
main - GraphicsConfigurationFactory.initSingleton()
GraphicsConfigurationFactory.registerFactory() put DeviceCapsType[javax.media.nativewindow.AbstractGraphicsDevice, javax.media.nativewindow.CapabilitiesImmutable] -> jogamp.nativewindow.DefaultGraphicsConfigurationFactoryImpl@982fba98, overridding: null
GraphicsConfigurationFactory.registerFactory() put DeviceCapsType[com.jogamp.nativewindow.x11.X11GraphicsDevice, javax.media.nativewindow.CapabilitiesImmutable] -> jogamp.nativewindow.x11.X11GraphicsConfigurationFactory@9830a730, overridding: null
GraphicsConfigurationFactory.registerFactory() put DeviceCapsType[com.jogamp.nativewindow.awt.AWTGraphicsDevice, javax.media.nativewindow.CapabilitiesImmutable] -> jogamp.nativewindow.x11.awt.X11AWTGraphicsConfigurationFactory@98324518, overridding: null
open /tmp/jogamp_0000/file_cache/jln3514050511337699936/jln4624328718319207679/libjogl_desktop.so
GraphicsConfigurationFactory.registerFactory() put DeviceCapsType[com.jogamp.nativewindow.x11.X11GraphicsDevice, javax.media.opengl.GLCapabilitiesImmutable] -> jogamp.opengl.x11.glx.X11GLXGraphicsConfigurationFactory@983da6d8, overridding: null
java.lang.Exception: Stack trace
at java.lang.Thread.dumpStack(Thread.java:1344)
at javax.media.nativewindow.GraphicsConfigurationFactory.getFactory(GraphicsConfigurationFactory.java:229)
at jogamp.opengl.x11.glx.X11GLXGraphicsConfigurationFactory.registerFactory(X11GLXGraphicsConfigurationFactory.java:86)
at jogamp.opengl.x11.glx.X11GLXDrawableFactory.<init>(X11GLXDrawableFactory.java:123)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at com.jogamp.common.util.ReflectionUtil.createInstance(ReflectionUtil.java:171)
at com.jogamp.common.util.ReflectionUtil.createInstance(ReflectionUtil.java:193)
at com.jogamp.common.util.ReflectionUtil.createInstance(ReflectionUtil.java:213)
at com.jogamp.common.util.ReflectionUtil.createInstance(ReflectionUtil.java:235)
at javax.media.opengl.GLDrawableFactory.initSingletonImpl(GLDrawableFactory.java:166)
at javax.media.opengl.GLDrawableFactory.initSingleton(GLDrawableFactory.java:129)
at javax.media.opengl.GLProfile.initProfilesForDefaultDevices(GLProfile.java:1573)
at javax.media.opengl.GLProfile.access$100(GLProfile.java:76)
at javax.media.opengl.GLProfile$1.run(GLProfile.java:155)
at java.security.AccessController.doPrivileged(Native Method)
at javax.media.opengl.GLProfile.initSingleton(GLProfile.java:123)
at javax.media.opengl.GLProfile.getDefaultDevice(GLProfile.java:1837)
at com.jogamp.opengl.JoglVersion.getDefaultOpenGLInfo(JoglVersion.java:116)
at com.jogamp.newt.opengl.GLWindow.main(GLWindow.java:914)
GraphicsConfigurationFactory.getFactory: com.jogamp.nativewindow.x11.X11GraphicsDevice, javax.media.nativewindow.CapabilitiesImmutable
Factory #0: DeviceCapsType[javax.media.nativewindow.AbstractGraphicsDevice, javax.media.nativewindow.CapabilitiesImmutable] -> jogamp.nativewindow.DefaultGraphicsConfigurationFactoryImpl@982fba98
Factory #1: DeviceCapsType[com.jogamp.nativewindow.awt.AWTGraphicsDevice, javax.media.nativewindow.CapabilitiesImmutable] -> jogamp.nativewindow.x11.awt.X11AWTGraphicsConfigurationFactory@98324518
Factory #2: DeviceCapsType[com.jogamp.nativewindow.x11.X11GraphicsDevice, javax.media.nativewindow.CapabilitiesImmutable] -> jogamp.nativewindow.x11.X11GraphicsConfigurationFactory@9830a730
Factory #3: DeviceCapsType[com.jogamp.nativewindow.x11.X11GraphicsDevice, javax.media.opengl.GLCapabilitiesImmutable] -> jogamp.opengl.x11.glx.X11GLXGraphicsConfigurationFactory@983da6d8
GraphicsConfigurationFactory.getFactory() deviceTypes: [class com.jogamp.nativewindow.x11.X11GraphicsDevice, class javax.media.nativewindow.DefaultGraphicsDevice, interface javax.media.nativewindow.AbstractGraphicsDevice]
GraphicsConfigurationFactory.getFactory() capabilitiesTypes: [interface javax.media.nativewindow.CapabilitiesImmutable]
GraphicsConfigurationFactory.getFactory() found DeviceCapsType[com.jogamp.nativewindow.x11.X11GraphicsDevice, javax.media.nativewindow.CapabilitiesImmutable] -> jogamp.nativewindow.x11.X11GraphicsConfigurationFactory@9830a730
GraphicsConfigurationFactory.registerFactory() put DeviceCapsType[com.jogamp.nativewindow.x11.X11GraphicsDevice, javax.media.opengl.GLCapabilitiesImmutable] -> jogamp.opengl.egl.EGLGraphicsConfigurationFactory@98423d68, overridding: jogamp.opengl.x11.glx.X11GLXGraphicsConfigurationFactory@983da6d8
GraphicsConfigurationFactory.registerFactory() put DeviceCapsType[com.jogamp.nativewindow.egl.EGLGraphicsDevice, javax.media.opengl.GLCapabilitiesImmutable] -> jogamp.opengl.egl.EGLGraphicsConfigurationFactory@98423d68, overridding: null
open /tmp/jogamp_0000/file_cache/jln3514050511337699936/jln4624328718319207679/libjogl_mobile.so
main - EGLGraphicsDevice.open(): EGLGraphicsDevice[type .egl, connection decon, unitID 0, handle 0x0, owner true, ResourceToolkitLock[obj 0x984661f0, isOwner false, <98466200, 98466210>[count 0, qsz 0, owner <NULL>]]]
Info: Nativewindow X11 Error: 16 - BadLength (poly request too large or internal Xlib length error), dpy 0x912d77c0, id 17, # 15: 135:17 Unknown
java.lang.Exception: Stack trace
at java.lang.Thread.dumpStack(Thread.java:1344)
at jogamp.nativewindow.x11.X11Util.dumpStack(X11Util.java:618)
at jogamp.opengl.egl.EGL.dispatch_eglInitialize0(Native Method)
at jogamp.opengl.egl.EGL.eglInitialize(EGL.java:564)
at jogamp.opengl.egl.EGLDisplayUtil.eglInitialize(EGLDisplayUtil.java:146)
at jogamp.opengl.egl.EGLDisplayUtil.eglGetDisplayAndInitialize(EGLDisplayUtil.java:182)
at jogamp.opengl.egl.EGLDisplayUtil.eglGetDisplayAndInitialize(EGLDisplayUtil.java:198)
at jogamp.opengl.egl.EGLDisplayUtil$1.eglGetAndInitDisplay(EGLDisplayUtil.java:255)
at com.jogamp.nativewindow.egl.EGLGraphicsDevice.open(EGLGraphicsDevice.java:95)
at jogamp.opengl.egl.EGLDisplayUtil.eglCreateEGLGraphicsDevice(EGLDisplayUtil.java:274)
at jogamp.opengl.egl.EGLDrawableFactory.<init>(EGLDrawableFactory.java:197)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at com.jogamp.common.util.ReflectionUtil.createInstance(ReflectionUtil.java:171)
at com.jogamp.common.util.ReflectionUtil.createInstance(ReflectionUtil.java:193)
at com.jogamp.common.util.ReflectionUtil.createInstance(ReflectionUtil.java:213)
at com.jogamp.common.util.ReflectionUtil.createInstance(ReflectionUtil.java:235)
at javax.media.opengl.GLDrawableFactory.initSingletonImpl(GLDrawableFactory.java:181)
at javax.media.opengl.GLDrawableFactory.initSingleton(GLDrawableFactory.java:129)
at javax.media.opengl.GLProfile.initProfilesForDefaultDevices(GLProfile.java:1573)
at javax.media.opengl.GLProfile.access$100(GLProfile.java:76)
at javax.media.opengl.GLProfile$1.run(GLProfile.java:155)
at java.security.AccessController.doPrivileged(Native Method)
at javax.media.opengl.GLProfile.initSingleton(GLProfile.java:123)
at javax.media.opengl.GLProfile.getDefaultDevice(GLProfile.java:1837)
at com.jogamp.opengl.JoglVersion.getDefaultOpenGLInfo(JoglVersion.java:116)
at com.jogamp.newt.opengl.GLWindow.main(GLWindow.java:914)
libEGL warning: DRI2: failed to authenticate
<application runs>
Library load order using avian:
java -avian-git -Dnativewindow.debug=true -Dnativewindow.debug.JAWT=true -cp jogl-all.jar:gluegen-rt.jar com.jogamp.newt.opengl.GLWindow
FAILED Test output:
...
Implementation Commit: ccfc9b529b1dbd6003a62cb4215e2cdaeb8c37fd
-----------------------------------------------------------------------------------------------------
Thread-0xb761c4f8 - Info: NativeWindowFactory.<init>
Thread-0xb761c4f8 - NativeWindowFactory.initSingleton()
JAWTUtil initialization (JAWT/JNI/...
open /usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386//tmp/jogamp_0000/file_cache/jln4355273086748331556/jln4958764329972598846/libnativewindow_awt.so
open /usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/xawt//tmp/jogamp_0000/file_cache/jln4355273086748331556/jln4958764329972598846/libnativewindow_awt.so
open /tmp/jogamp_0000/file_cache/jln4355273086748331556/jln4958764329972598846/libnativewindow_awt.so
NativeWindowFactory.shutdown() START: JVM Shutdown true, on thread NativeWindowFactory_ShutdownHook
NativeWindowFactory.shutdown(): Post customShutdownHook
NativeWindowFactory_ShutdownHook - Info: GraphicsConfigurationFactory.<init>
NativeWindowFactory_ShutdownHook - NativeWindowFactory.shutdown() END JVM Shutdown true
<application ends premature>
it appears that the call to Toolkit.getDefaultToolkit() and the explicit loading of jawt manually inside the JAWTJNILibLoader's static constructor never takes place when using avian.
Cheers
Xerxes