我正在完成一个使用Java3D开发的游戏。由于Java3D没有标准的JRE,所以我给这个游戏的所有人都必须下载Java3D。我的一些朋友对计算机的了解程度要低一些,所以我认为将Jars写入磁盘并用Java动态加载它们的工作要少得多。有更好的解决方案吗?或者是动态加载Jars的方式?
我已经从我这里的另一台计算机上安装了Java3D:
这是一个非常快速的安装,但如果你根本不需要下载任何东西会更好。如果他们只是将Java3D用于我的游戏,那么他们在下载它时遇到麻烦似乎不合逻辑。
有没有更有效的解决方案?是动态加载Jars的方式吗?
修改
这是我的问题简化:
现在这是我的简化问题:
如何在未安装Java3D的计算机上运行Java3D?我想将Jar文件与游戏一起写入CD,并且能够直接在CD上播放游戏,没有安装没有下载。我怎么能这样做?
答案 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?