1

我正在完成一个使用 Java3D 开发的游戏。由于 Java3D 不附带标准的 JRE,因此我提供此游戏的所有人都必须下载 Java3D。我的一些朋友不太懂计算机,所以我认为只需将 Jars 写入磁盘并在 Java 中动态加载它们会少很多工作。有没有更好的解决方案?还是动态加载罐子是要走的路?

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

这是一个非常快速的安装,但如果您根本不需要下载任何东西会更好。如果他们只打算在我的游戏中使用 Java3D,那么他们费尽心思去下载它似乎是不合逻辑的。

有没有更有效的解决方案?动态加载罐子只是要走的路吗?


编辑

这是我的问题简化:

  1. Java3D 不是 Java 的标准部分,它是一个必须单独安装的扩展
  2. Java3D 包含 3 个 Jar 文件(j3core.jar、j3dutils、vecmath)
  3. 我希望能够在其他计算机上运行我的游戏而无需下载 Jar 文件

现在这是我的简化问题:

如何在没有安装 Java3D 的计算机上运行 Java3D?我想将 Jar 文件连同游戏一起写入 CD,并且能够直接从 CD 上玩游戏,无需安装无需下载。我怎样才能做到这一点?

4

3 回答 3

1

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

我认为这就是大多数磁盘分发游戏的工作方式。掌握这些更高级的设置包装器需要一些时间,但它们是值得的。除了 Inno Setup,我什么都不知道,但到目前为止它能够满足我的任何要求,这就是我推荐它的原因。

于 2012-08-08T20:00:02.440 回答
1

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

一些代码可以为您指明正确的方向:

Blah.java

public class blah{
    public native void meh();

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

废话.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 文件,为了便于执行,把它扔进一个罐子里。现在是重要的部分,文件的布局!

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

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

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

于 2012-08-09T03:04:37.680 回答
1

从这里下载类:http: //java3d.java.net/binary-builds.html并提取包含的 zip 文件。将 lib 文件夹中的 jar 文件(vecmath、j3dcore、j3dutils)提取到您的类文件夹中。将您的类文件夹捆绑到一个 jar 文件中。

现在按照以下步骤将上述 zip 文件中 bin 文件夹中的库(*.dll、*.so)添加到您的 jar 文件中: 如何制作包含 DLL 文件的 JAR 文件?

于 2012-08-09T07:53:18.050 回答