27601


JavaのライブラリのJOGLを使用したいのですが、実行できず原因もわからず困っています。

### 背景

こちらのサイトを閲覧しながら、勉強しています。  
[JOGLによるOpenGL入門](http://toruwest.github.io/jogl-tutorial-
document/JOGL%E3%81%AB%E3%82%88%E3%82%8BOpenGL%E5%85%A5%E9%96%80.pdf#search='jogl+%E4%BD%BF%E3%81%84%E6%96%B9')  
こちらの、`3.3 空のウィンドウを開く`という章を行っています。

### 環境

クラスパスを通しているjarファイルは以下の２点です。  
`gluegen-rt.jar`  
`jogl-all.jar`

これらを、以下の`Main`クラスに  
`javac -cp .:./gluegen-rt.jar:./jogl-all.jar Main.java`  
として、コンパイルしています。  
コンパイルは通るのですが、以下のように実行するとエラーが起こります。  
`java -cp .:./gluegen-rt.jar:./jogl-all.jar Main`

### エラー内容

[code]

    Exception in thread "main" java.lang.UnsatisfiedLinkError: Can't load library: /Users/***/workspace/JOGL/myjogl/natives/macosx-universal//gluegen-rt
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1827)
    at java.lang.Runtime.load0(Runtime.java:809)
    at java.lang.System.load(System.java:1086)
    at com.jogamp.common.jvm.JNILibLoaderBase.loadLibraryInternal(JNILibLoaderBase.java:624)
    at com.jogamp.common.jvm.JNILibLoaderBase.access$000(JNILibLoaderBase.java:63)
    at com.jogamp.common.jvm.JNILibLoaderBase$DefaultAction.loadLibrary(JNILibLoaderBase.java:106)
    at com.jogamp.common.jvm.JNILibLoaderBase.loadLibrary(JNILibLoaderBase.java:487)
    at com.jogamp.common.os.DynamicLibraryBundle$GlueJNILibLoader.loadLibrary(DynamicLibraryBundle.java:421)
    at com.jogamp.common.os.Platform$1.run(Platform.java:317)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.jogamp.common.os.Platform.<clinit>(Platform.java:287)
    at com.jogamp.opengl.GLProfile.<clinit>(GLProfile.java:147)
    at Main.<init>(Main.java:21)
    at Main.main(Main.java:17)
    
[/code]

### コード

[code]

    import com.jogamp.opengl.GL;
    import com.jogamp.opengl.GLAutoDrawable;
    import com.jogamp.opengl.GLCapabilities;  
    import com.jogamp.opengl.GLEventListener; 
    import com.jogamp.opengl.GLProfile;
    import com.jogamp.newt.event.WindowAdapter;
    import com.jogamp.newt.event.WindowEvent; 
    import com.jogamp.newt.opengl.GLWindow; 
    import com.jogamp.opengl.util.Animator;
    
    public class Main implements GLEventListener{
    
        private Animator animator;
    
        public static void main(String[] args){
            new Main();
        }
    
        public Main(){
            GLCapabilities caps = new GLCapabilities(GLProfile.get(GLProfile.GL2));//(2) 
            GLWindow glWindow = GLWindow.create(caps); //(3)
            glWindow.setTitle("First demo (Newt)"); //(4)
            glWindow.setSize(300, 300); //(5)
            glWindow.addWindowListener(new WindowAdapter() { //(6) 
                @Override
                public void windowDestroyed(WindowEvent evt) {
                    System.exit(0);
                }
            });
    
            glWindow.addGLEventListener(this); //(7)
            this.animator = new Animator(); //(8) 
            this.animator.add(glWindow);
            this.animator.start(); 
            glWindow.setVisible(true); //(10)
        }
    
        @Override
        public void init(GLAutoDrawable drawable) {}
    
        @Override
        public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {}
    
        @Override
        public void display(GLAutoDrawable drawable) {}
    
        @Override
        public void dispose(GLAutoDrawable drawable) {
            if(this.animator != null) this.animator.stop();
        } 
    }
    
[/code]


CC BY-SA 3.0
2016-07-13T09:19:22.787
27599
2016-07-13T11:26:37.150
13404
question
java
JOGLで「Exception in thread "main" java.lang.UnsatisfiedLinkError」が生じる


実行する場合にはそれら2つの`jar`に加えて環境固有のファイルが必要になります。MacOSの場合は下記2ファイルです。

  * `gluegen-rt-natives-macosx-universal.jar`
  * `jogl-all-natives-macosx-universal.jar`

合計4つの`jar`が必要、ということです。  
4ファイルとも同一ディレクトリに置いておけば認識されるようです。

参照されているPDFにも書かれている通り、ダウンロードしたファイルを展開したままのディレクトリ構成で使用すればそのような形になっているので、問題は起きないでしょう。

> 実行時にはプラットフォーム依存のネイティブ・ライブラリも必要となるのですが、JOGLには実行環境を調査して、必
> 要なネイティブ・ライブラリを自動的にロードする仕組みが備わっているので、先ほどのJARファイルをクラスパスに設定しておけ ば、環境
> 変数PATHや、LD_LIBRARY_PATH、Eclipseでのネイティブ・ライブラリの場所などを設定する必要はありません。
> この仕組みは、ディレクトリ構成がアーカイブファイルを解凍したときのままであることが前提条件のようですので、アーカイブファイルを解凍したらディレクトリ構成を変えな
> いようにします。

参考:

  * [Unzipping the files - Downloading and installing JOGL - JogampWiki](http://jogamp.org/wiki/index.php/Downloading_and_installing_JOGL#Unzipping_the_files)
  * [Compile and run your project from the command line - Setting up a JogAmp project in your favorite IDE - JogampWiki](https://jogamp.org/wiki/index.php/Setting_up_a_JogAmp_project_in_your_favorite_IDE#Compile_and_run_your_project_from_the_command_line)


CC BY-SA 3.0
2016-07-13T11:21:06.340
27601
2016-07-13T11:26:37.150
2016-07-13T11:26:37.150
2808
2808
27599
answer