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/jni在里面java.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.soEclipse j3dcore.jar,如果我将本地库( -> 添加外部 JAR...):j3dutils.jarvecmath-1.5.2.jar

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

但我想知道是否真的没有不需要这个副本的解决方案。

于 2012-04-04T12:30:05.360 回答
1

我在尝试运行需要java3d. 我仅将 Eclipse 用于编译和打包可运行的 jar 部分(因为它是一个 Maven 项目),但我遇到的运行时错误属于同一类型。我想确认moooeeeeep的回答是中肯的并且非常有帮助。我在这里发帖的原因主要是因为我认为这对其他人提供完整步骤很有用(独立于 Eclipse,因为在这两种情况下使用 Eclipse 设施或 Maven 依赖项设置东西都失败了)。这里的一切都是关于正确设置 JRE

注意: 我在 OpenJDK-7-amd64(和 Debian - 64 位系统)下工作。i386因此,如果适用,请随意调整以下步骤(只需将“ amd64 ”替换为“ i386 ”)。

这对我有用:

sudo apt-get install libjava3d-jni libjava3d-java libvecmath-java

这将添加需要注入到 JRE 中的文件:

$ locate j3d
/usr/lib/jni/libj3dcore-ogl.so
/usr/share/java/j3dcore-1.5.2+dfsg.jar
/usr/share/java/j3dcore.jar
/usr/share/java/j3dutils-1.5.2+dfsg.jar
/usr/share/java/j3dutils.jar

由于这些文件位于不同的位置,但绝对不在 JRE 的位置,因此复制(或链接)如下:

动态库:

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

罐子:

sudo cp /usr/share/java/j3d*.jar  /usr/lib/jvm/java-7-openjdk-amd64/jre/lib/ext/
sudo cp /usr/share/java/vecmath-*.jar /usr/lib/jvm/java-7-openjdk-amd64/jre/lib/ext/

导致 :

/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/amd64/libj3dcore-ogl.so
/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/ext/j3dcore-1.5.2+dfsg.jar
/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/ext/j3dcore.jar
/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/ext/j3dutils-1.5.2+dfsg.jar
/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/ext/j3dutils.jar
/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/ext/vecmath-1.5.2.jar

希望这可以提供任何帮助...

于 2014-07-16T21:22:02.297 回答
0

我在另一个项目上遇到了同样的问题,这为我解决了这个问题:

打开项目的运行配置,选择“Arguments”选项卡并将以下内容插入“VM arguments”框中

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

我不知道你为什么要在这里再次给出路径。它也不适用于相对的,但这种方式对我有用。

于 2012-04-04T11:37:31.360 回答
0

java.lang.UnsatisfiedLinkError 只有在找不到本地方法的定义时才会抛出。

于 2012-04-04T11:51:20.323 回答