java - 如何动态加载 Java3D 库?

标签 java dynamic java-3d

我正在完成我使用 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/

相关文章:

java - 此代码打印一个包含 0 0 0 0 0 5 的数组,而不是预期的数组

java - 当分配给子类对象的父类(super class)引用调用重写方法时会发生什么?

c# - 使用动态键反序列化 JSON

从 .jar 运行应用程序时出现 Java 3d 错误

java - GraphicsConfiguration 与 Canvas3D 不兼容

java - 如何编写在请求正文中接受 XML 的 swagger API

java - 如何使用图像库在 Java 中创建自定义 JButton?

java - Struts2 - 通过带有动态参数的注释转发

java - 使用 LibGDX 创建角色选择屏幕

Java3D,如何改变 View 平台剪辑距离?