1

次のような単純な Java プロジェクト (ここの例から適応) があります。

import com.sun.j3d.utils.universe.SimpleUniverse;
import com.sun.j3d.utils.geometry.ColorCube;
import javax.media.j3d.BranchGroup;

public class HelloWorld {

    public HelloWorld()
    {
        SimpleUniverse universe = new SimpleUniverse();
        BranchGroup group = new BranchGroup();
        group.addChild(new ColorCube(0.3));
        universe.getViewingPlatform().setNominalViewingTransform();
        universe.addBranchGraph(group);
    }

    public static void main(String[] args) {
        System.out.println("Hello World!");
        System.out.println("PATH : " + System.getProperty("java.library.path"));
        new HelloWorld();        
    }
}

私の出力は次のとおりです。

Hello World!
PATH : /usr/lib/jvm/java-6-openjdk/jre/lib/amd64/server:/usr/lib/jvm/java-6-openjdk/jre/lib/amd64:/usr/lib/jvm/java-6-openjdk/jre/../lib/amd64:/usr/java/packages/lib/amd64:/usr/lib/jni:/lib:/usr/lib
Exception in thread "main" java.lang.UnsatisfiedLinkError: no j3dcore-ogl in java.library.path
  at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1681)
  at java.lang.Runtime.loadLibrary0(Runtime.java:840)
  at java.lang.System.loadLibrary(System.java:1047)
  at javax.media.j3d.NativePipeline$1.run(NativePipeline.java:231)
  at java.security.AccessController.doPrivileged(Native Method)
  at javax.media.j3d.NativePipeline.loadLibrary(NativePipeline.java:200)
  at javax.media.j3d.NativePipeline.loadLibraries(NativePipeline.java:157)
  at javax.media.j3d.MasterControl.loadLibraries(MasterControl.java:987)
  at javax.media.j3d.VirtualUniverse.<clinit>(VirtualUniverse.java:299)
  at HelloWorld.<init>(HelloWorld.java:10)
  at HelloWorld.main(HelloWorld.java:20)

この例外は、ライブラリlibj3dcore-ogl.soが見つからなかったことを示していると思います。場所は次のとおりです。

$ locate libj3dcore-ogl.so
/usr/lib/jni/libj3dcore-ogl.so

上記の出力が示すように、/usr/lib/jniis insidejava.library.pathです。私は何を間違っていますか?(Ubuntu 10.04 と Eclipse 3.7.2 を使用しています - それが問題になる場合は?)

Java は私にとって未知の領域です。したがって、メモ/提案/回答はできるだけ詳細にしてください。

更新 1

どうやらそれは64ビットライブラリです(64ビットオペレーティングシステム上):

$ file /usr/lib/jni/libj3dcore-ogl.so
/usr/lib/jni/libj3dcore-ogl.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, stripped

実行環境として openjdk を使用しています。java3d( libjava3d-java) と openjdk() の両方openjdk-6-jdkが 経由でインストールされaptitudeます。

4

4 に答える 4

3

興味深いことに、ターミナルからアプリケーションをコンパイルして実行すると機能します。

javac -classpath /usr/share/java/j3dcore.jar:/usr/share/java/j3dutils.jar:/usr/share/java/vecmath-1.5.2.jar:. HelloWorld.java
java -classpath /usr/share/java/j3dcore.jar:/usr/share/java/j3dutils.jar:/usr/share/java/vecmath-1.5.2.jar:. HelloWorld

しかし、私は本当にEclipseを使ってこの種のことをしたいと思っています.

$ java -version
java version "1.6.0_20"
OpenJDK Runtime Environment (IcedTea6 1.9.13) (6b20-1.9.13-0ubuntu1~10.04.1)
OpenJDK 64-Bit Server VM (build 19.0-b09, mixed mode)

libj3dcore-ogl.soネイティブ ライブラリ ( ) を jvm ディレクトリにコピーし、ライブラリ ( j3dcore.jarj3dutils.jar、 ) を外部 jar としてビルド パス ライブラリに追加すると、Eclipse でも動作しvecmath-1.5.2.jarます (プロジェクトを右クリック -> プロパティ -> Java ビルド パス -> ライブラリ-> 外部 JAR を追加...):

sudo cp /usr/lib/jni/libj3dcore-ogl.so /usr/lib/jvm/java-6-openjdk/jre/lib/amd64/

しかし、このコピーを必要としない解決策が本当にないのではないかと思います。

于 2012-04-04T12:30:05.360 に答える
0

私は別のプロジェクトで同じ問題を抱えていましたが、これで解決しました:

プロジェクトの実行構成を開き、[引数] タブを選択して、[VM 引数] ボックスに以下を挿入します。

-Djava.library.path=/usr/lib/jni

ここで再びパスを指定する必要がある理由がわかりません。相対的なものでも機能しませんが、この方法では機能します。

于 2012-04-04T11:37:31.360 に答える
0

java.lang.UnsatisfiedLinkError は、ネイティブ メソッドの定義が見つからない場合にのみスローされます。

于 2012-04-04T11:51:20.323 に答える