JOGLのエラー
JOGL - Java™ Binding for the OpenGL® API のプログラムを久しぶりに動かそうとしたところ、下記のエラーが出てしまい動きませんでした。
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 1
at jogamp.opengl.windows.wgl.awt.WindowsAWTWGLGraphicsConfigurationFactory.chooseGraphicsConfigurationImpl(WindowsAWTWGLGraphicsConfigurationFactory.java:171)
at com.jogamp.nativewindow.GraphicsConfigurationFactory.chooseGraphicsConfiguration(GraphicsConfigurationFactory.java:424)
at com.jogamp.opengl.awt.GLCanvas.chooseGraphicsConfiguration(GLCanvas.java:1560)
at com.jogamp.opengl.awt.GLCanvas.addNotify(GLCanvas.java:611)
at java.desktop/java.awt.Container.addNotify(Container.java:2804)
at java.desktop/java.awt.Window.addNotify(Window.java:791)
at java.desktop/java.awt.Frame.addNotify(Frame.java:495)
at java.desktop/java.awt.Window.show(Window.java:1053)
at java.desktop/java.awt.Component.show(Component.java:1728)
at java.desktop/java.awt.Component.setVisible(Component.java:1675)
at java.desktop/java.awt.Window.setVisible(Window.java:1036)
...
筆者の環境
- OS: Windows
- Java: Eclipse Adoptium Open JDK 17.0.4.8
- JOGL: 2.3.2
- Gluegen: 2.3.2
- 実行しようとしたプログラム:java.awt上でGLCanvasを使ったプログラム
- 利用ツール: Maven
エラーが出た時点でのpom.xmlファイル
<!-- https://mvnrepository.com/artifact/org.jogamp.jogl/jogl-all-main -->
<dependency>
<groupId>org.jogamp.jogl</groupId>
<artifactId>jogl-all-main</artifactId>
<version>2.3.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.jogamp.gluegen/gluegen-rt-main -->
<dependency>
<groupId>org.jogamp.gluegen</groupId>
<artifactId>gluegen-rt-main</artifactId>
<version>2.3.2</version>
</dependency>
原因
調査したところ、下記の情報を見つけました。
- https://forum.jogamp.org/Crash-in-WindowsAWTWGLGraphicsConfigurationFactory-td4040703.html
- https://forum.jogamp.org/Java3D-Javafx-doesn-t-work-on-Java-14-td4040679.html
- https://forum.jogamp.org/Maven-repo-to-get-2-4-0-rc-td4041046.html
- https://github.com/jzy3d/jogl/issues/4
上記の情報をまとめると、
- JOGL 2.3.2のWindowsAWTWGLGraphicsConfigurationFactory.javaで下記のコードのバグがあるため、ArrayIndexOutOfBoundsExceptionを吐いてしまっていることが根本原因。
if( 0 > gcIdx ) { // 0 <= gcIdx が正しい。JOGL 2.4.0では修正されている。
chosenGC = configs[gcIdx];
if(DEBUG) {
System.err.println("WindowsAWTWGLGraphicsConfigurationFactory: Found matching AWT PFD ID "+winConfig.getPixelFormatID()+" -> "+winConfig);
}
}
- JOGL 2.4.0に更新できればよいのですが、Maven Central Repositoryで提供されていない!
- どこか提供しているレポジトリがないか検索したところ、https://github.com/jzy3d/jogl-maven-deployerを発見。
解決法
pom.xmlの更新
下記のリポジトリをpom.xmlに追加。
<repositories>
<repository>
<id>jzy3d-snapshots</id>
<name>Jzy3d Snapshots</name>
<url>https://maven.jzy3d.org/snapshots/</url>
</repository>
<repository>
<id>jzy3d-releases</id>
<name>Jzy3d Releases</name>
<url>https://maven.jzy3d.org/releases/</url>
</repository>
</repositories>
dependenciesセクションで、org.jogamp.jogl、org.jogamp.gluegenの2.3.2の代わりに下記を記述。
<!-- JOGL -->
<dependency>
<groupId>org.jogamp.jogl</groupId>
<artifactId>jogl-all</artifactId>
<version>v2.4.0-rc4</version>
</dependency>
<dependency>
<groupId>org.jogamp.jogl</groupId>
<artifactId>jogl-all-natives-linux-aarch64</artifactId>
<version>v2.4.0-rc4</version>
</dependency>
<dependency>
<groupId>org.jogamp.jogl</groupId>
<artifactId>jogl-all-natives-linux-amd64</artifactId>
<version>v2.4.0-rc4</version>
</dependency>
<dependency>
<groupId>org.jogamp.jogl</groupId>
<artifactId>jogl-all-natives-linux-armv6hf</artifactId>
<version>v2.4.0-rc4</version>
</dependency>
<dependency>
<groupId>org.jogamp.jogl</groupId>
<artifactId>jogl-all-natives-linux-i586</artifactId>
<version>v2.4.0-rc4</version>
</dependency>
<dependency>
<groupId>org.jogamp.jogl</groupId>
<artifactId>jogl-all-natives-macosx-universal</artifactId>
<version>v2.4.0-rc4</version>
</dependency>
<dependency>
<groupId>org.jogamp.jogl</groupId>
<artifactId>jogl-all-natives-windows-amd64</artifactId>
<version>v2.4.0-rc4</version>
</dependency>
<dependency>
<groupId>org.jogamp.jogl</groupId>
<artifactId>jogl-all-natives-windows-i586 </artifactId>
<version>v2.4.0-rc4</version>
</dependency>
<!-- GLUEGEN -->
<dependency>
<groupId>org.jogamp.gluegen</groupId>
<artifactId>gluegen-rt</artifactId>
<version>v2.4.0-rc4</version>
</dependency>
<dependency>
<groupId>org.jogamp.gluegen</groupId>
<artifactId>gluegen-rt-natives-macosx-universal</artifactId>
<version>v2.4.0-rc4</version>
</dependency>
<dependency>
<groupId>org.jogamp.gluegen</groupId>
<artifactId>gluegen-rt-natives-linux-aarch64</artifactId>
<version>v2.4.0-rc4</version>
</dependency>
<dependency>
<groupId>org.jogamp.gluegen</groupId>
<artifactId>gluegen-rt-natives-linux-amd64</artifactId>
<version>v2.4.0-rc4</version>
</dependency>
<dependency>
<groupId>org.jogamp.gluegen</groupId>
<artifactId>gluegen-rt-natives-linux-armv6hf</artifactId>
<version>v2.4.0-rc4</version>
</dependency>
<dependency>
<groupId>org.jogamp.gluegen</groupId>
<artifactId>gluegen-rt-natives-linux-i586</artifactId>
<version>v2.4.0-rc4</version>
</dependency>
<dependency>
<groupId>org.jogamp.gluegen</groupId>
<artifactId>gluegen-rt-natives-windows-amd64</artifactId>
<version>v2.4.0-rc4</version>
</dependency>
<dependency>
<groupId>org.jogamp.gluegen</groupId>
<artifactId>gluegen-rt-natives-windows-i586 </artifactId>
<version>v2.4.0-rc4</version>
</dependency>
Java VMのオプション
そのまま実行すると、下記のエラー発生してしまいました。
Exception in thread "main" com.jogamp.opengl.GLException: Unable to determine GraphicsConfiguration: WindowsWGLGraphicsConfiguration[DefaultGraphicsScreen[WindowsGraphicsDevice[type .windows, connection decon, unitID 0, handle 0x0, owner false, NullToolkitLock[obj 0x279e06b1]], idx 0], pfdID 2, ARB-Choosen true,
requested GLCaps[rgba 8/8/8/0, opaque, accum-rgba 0/0/0/0, dp/st/ms 16/0/0, dbl, mono , hw, GLProfile[GL3bc/GL3bc.hw], on-scr[.]],
chosen GLCaps[wgl vid 2 arb: rgba 8/8/8/8, opaque, accum-rgba 0/0/0/0, dp/st/ms 24/8/0, dbl, mono , hw, GLProfile[GL3bc/GL3bc.hw], on-scr[.]]]
at jogamp.opengl.windows.wgl.awt.WindowsAWTWGLGraphicsConfigurationFactory.chooseGraphicsConfigurationImpl(WindowsAWTWGLGraphicsConfigurationFactory.java:182)
at com.jogamp.nativewindow.GraphicsConfigurationFactory.chooseGraphicsConfiguration(GraphicsConfigurationFactory.java:424)
at com.jogamp.opengl.awt.GLCanvas.chooseGraphicsConfiguration(GLCanvas.java:1513)
at com.jogamp.opengl.awt.GLCanvas.addNotify(GLCanvas.java:609)
at java.desktop/java.awt.Container.addNotify(Container.java:2804)
at java.desktop/java.awt.Window.addNotify(Window.java:791)
at java.desktop/java.awt.Frame.addNotify(Frame.java:495)
at java.desktop/java.awt.Window.show(Window.java:1053)
at java.desktop/java.awt.Component.show(Component.java:1728)
at java.desktop/java.awt.Component.setVisible(Component.java:1675)
at java.desktop/java.awt.Window.setVisible(Window.java:1036)
...
上記のエラーが発生した場合は、プログラム実行時に下記のオプションをVMに渡してください。
--add-exports java.base/java.lang=ALL-UNNAMED
--add-exports java.desktop/sun.awt=ALL-UNNAMED
--add-exports java.desktop/sun.java2d=ALL-UNNAMED
補足
ちなみに最近のJava 3DはJOGLに依存しているので、Java 3Dのプログラムでも同様のエラーが発生することがあります。その場合も、この記事の通りpom.xmlを更新してみてください。
公式のリポジトリにorg.jogamp.jogl、org.jogamp.gluegenのバージョン2.4.0がリリースされたら、おそらく不要になりますが、2022年8月時点での解決法ということで参考になれば幸いです。
コメント