如何动态加载Java3D库?

时间:2012-08-07 02:11:34

标签: java dynamic java-3d

我正在完成一个使用Java3D开发的游戏。由于Java3D没有标准的JRE,所以我给这个游戏的所有人都必须下载Java3D。我的一些朋友对计算机的了解程度要低一些,所以我认为将Jars写入磁盘并用Java动态加载它们的工作要少得多。有更好的解决方案吗?或者是动态加载Jars的方式?

我已经从我这里的另一台计算机上安装了Java3D:

这是一个非常快速的安装,但如果你根本不需要下载任何东西会更好。如果他们只是将Java3D用于我的游戏,那么他们在下载它时遇到麻烦似乎不合逻辑。

有没有更有效的解决方案?是动态加载Jars的方式吗?


修改

这是我的问题简化:

  1. Java3D不是Java的标准部分,它是必须单独安装的扩展
  2. Java3D由3个Jar文件组成(j3core.jar,j3dutils,vecmath)
  3. 我希望能够在其他计算机上运行我的游戏而无需下载Jar文件
  4. 现在这是我的简化问题:

    如何在未安装Java3D的计算机上运行Java3D?我想将Jar文件与游戏一起写入CD,并且能够直接在CD上播放游戏,没有安装没有下载。我怎么能这样做?

3 个答案:

答案 0 :(得分:1)

如果要通过磁盘分发,可以将应用程序包装在设置可执行文件中(例如使用免费的Inno Setup)。用户放入磁盘后,将开始安装。您可以在Inno Setup中配置您的设置,以便安装正确版本的Java3D。

我认为这就是大多数磁盘分布式游戏的工作原理。要获得那些更高级的设置包装器,需要一点点,但它们是值得的。除了Inno Setup之外我什么都不知道,但到目前为止我能够处理我的任何要求,这就是为什么我推荐那个。

答案 1 :(得分:1)

jar不是特定于平台的,动态库中的本机代码是。动态库已在代码中调用时加载。如果您回顾一下该代码,您会看到loadLibrary()没有要求扩展。这是有原因的,JNI(Java Native Interface)根据它运行的系统寻找某些扩展。出于这个原因,只需打包JNI可以找到它的所有动态库,例如在应用程序旁边,JNI将负责其余的工作。

一些代码指向正确的方向:

Blah.java

public class blah{
    public native void meh();

    public static void main(String args[]) {
        meh();
    }
}
static {
    System.loadLibrary("thing");
}

Blah.cpp

#include <jni.h>
#include <iostream>
#include "Blah.h"

JNIEXPORT void JNICALL Java_Blah_meh() {
    cout << "Meh.";
}

Blah.cpp(由javah程序生成的Blah.h)被编译成每个主要系统的动态库(thing.dll,thing.dylib,thing.so)。 Blah.java被编译成一个.class文件,只是为了便于执行而将其丢弃在一个jar中。 现在重要的是文件的布局!

ThingApp //that's a folder
  |thing.dll
  |thing.dylib
  |thing.so
  |Blah.jar

将它放在任何系统上,由于扩展,JNI将为系统找到正确的文件,将库加载到内存中,执行代码并打印出“Meh。”。 JNI查找文件,因为它们位于PATH环境变量(或系统等效项)中。 PATH包括执行的代码/程序所在的文件夹,使用java.library.path系统属性设置的文件夹,以及包含在PATH变量本身中的文件夹。

基本上你只需要担心关于PATH的部分,因为其他一切都是为你完成的!

答案 2 :(得分:1)

从这里下载课程:http://java3d.java.net/binary-builds.html并解压缩包含的zip文件。将lib文件夹中的jar文件(vecmath,j3dcore,j3dutils)解压缩到类文件夹。将类文件夹捆绑到单个jar文件中。

现在按照以下步骤将上面zip文件中bin文件夹中的库(* .dll,* .so)添加到jar文件中: How to make a JAR file that includes DLL files?