スキップしてメイン コンテンツに移動

JOGLのプログラムが起動しない問題

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>

原因

調査したところ、下記の情報を見つけました。

上記の情報をまとめると、

  1. 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);
	}

}
  1. JOGL 2.4.0に更新できればよいのですが、Maven Central Repositoryで提供されていない!
  2. どこか提供しているレポジトリがないか検索したところ、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月時点での解決法ということで参考になれば幸いです。

コメント