获取eclipse(java)以使用java3d

时间:2012-04-04 11:29:02

标签: java eclipse java-3d

我有一个简单的java项目(改编自示例here),如下所示:

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 个答案:

答案 0 :(得分: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.jarvecmath-1.5.2.jar),它也适用于Eclipse。外部jar到构建路径库(右键单击项目 - &gt;属性 - &gt; Java构建路径 - &gt;库 - &gt;添加外部JAR ...):

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

但我想知道是否确实没有不需要此副本的解决方案。

答案 1 :(得分:1)

我在尝试运行需要java3d的外国项目时遇到了类似的问题。我只使用Eclipse来编译和打包可运行的jar部件(因为它是一个Maven项目),但我得到的运行时错误是同一类型的。我想确认moooeeeep的回答是相关且非常有帮助的。我在这里发帖的原因主要是因为我认为这对其他人来说是非常有用的(完全独立于Eclipse,因为在两种情况下使用Eclipse工具或Maven依赖项设置都失败了)。 这里的一切都是为了正确设置JRE

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

以下是对我有用的内容:

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/

JARs:

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

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

答案 2 :(得分:0)

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

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

  

-Djava.library.path = / usr / lib中/ JNI

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

答案 3 :(得分:0)

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