gpt4 book ai didi

java - 如何动态加载 Java3D 库?

转载 作者:行者123 更新时间:2023-11-29 05:56:41 25 4
gpt4 key购买 nike

我正在完成我使用 Java3D 开发的游戏。由于 Java3D 没有附带标准的 JRE,我要向其提供此游戏的所有人都必须下载 Java3D。我的一些 friend 不太懂计算机,所以我认为将 Jar 文件写入磁盘并用 Java 动态加载它们的工作量会少很多。有更好的解决方案吗?或者动态加载 Jars 是可行的方法吗?

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

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

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


编辑

这里简化了我的问题:

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com