我正在完成我使用 Java3D 开发的游戏。由于 Java3D 没有附带标准的 JRE,我要向其提供此游戏的所有人都必须下载 Java3D。我的一些 friend 不太懂计算机,所以我认为将 Jar 文件写入磁盘并用 Java 动态加载它们的工作量会少很多。有更好的解决方案吗?或者动态加载 Jars 是可行的方法吗?
我已经从这里在我的另一台计算机上安装了 Java3D:
这是一个非常快速的安装,但如果您根本不需要下载任何东西就更好了。如果他们只打算在我的游戏中使用 Java3D,那么让他们费心下载它似乎并不合乎逻辑。
有没有更有效的解决方案?动态加载 Jars 是可行的方法吗?
编辑
这里简化了我的问题:
- Java3D 不是 Java 的标准部分,它是必须单独安装的扩展
- Java3D 包含 3 个 Jar 文件(j3core.jar、j3dutils、vecmath)
- 我希望能够在其他计算机上运行我的游戏而无需他们下载 Jar 文件
现在这是我的简化问题:
如何在没有安装 Java3D 的计算机上运行 Java3D?我想将 Jar 文件连同游戏一起写入 CD,并且能够直接从 CD 上玩游戏,无需安装,无需下载。我该怎么做?
最佳答案
jar 不是平台特定的,动态库中的 native 代码是。动态库已经加载,因为它们在代码中被调用。如果您回顾一下该代码,您会发现 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 的部分,因为其他一切都已为您完成!
关于java - 如何动态加载 Java3D 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11838393/