2012-08-07 26 views
1

我正在完成一個使用Java3D開發的遊戲。由於Java3D沒有標準的JRE,所以我給這個遊戲的所有人都必須下載Java3D。我的一些朋友不太懂電腦,所以我認爲將Jars寫入磁盤並動態地將它們加載到Java中將會很不方便。有更好的解決方案嗎?或者是動態加載Jars的路要走?如何動態加載Java3D庫?

我已經安裝的Java3D我的另一臺計算機上從這裏開始:

這是一個非常快速安裝,但它會更好,如果你沒有在下載任何東西所有。如果他們只是將Java3D用於我的遊戲,那麼他們通過下載它的麻煩似乎並不合乎邏輯。

有沒有更有效的解決方案呢?動態加載Jars只是要走的路?


編輯

這裏是我的問題簡化爲:

  1. Java3D的不是Java標準的一部分,它是必須單獨安裝的擴展
  2. Java3D的組成3 Jar文件(j3core.jar,j3dutils,vecmath)
  3. 我希望能夠在沒有其他計算機的情況下運行我的遊戲他們不必下載JAR文件

現在,這裏是我的簡單的問題:

如何在不安裝我的計算機上運行的Java3D是Java3D的?我想將Jar文件與遊戲一起寫入CD,並能夠在CD上播放遊戲,不需要安裝任何下載。我怎樣才能做到這一點?

+0

你怎麼分配你的遊戲?它是一個小程序嗎? – Thilo 2012-08-07 02:14:42

+0

@Thilo應用程序,我正在寫它到一個磁盤,然後分發它 – John 2012-08-07 02:25:27

+0

那麼你爲什麼不隨同遊戲分發java3d? – Qnan 2012-08-08 19:44:46

回答

1

罐子不是平臺特定的,動態庫中的本地代碼是。動態庫在代碼中被調用時已經被加載。如果您回顧一下該代碼,您會發現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"); 
} 

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,事一個動態庫。 dylib,thing.so)。 Blah.java被編譯成一個.class文件,將其放在一個jar文件中,以方便執行。 現在的重要部分,文件的佈局!

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

將這個在任何系統上和JNI會發現該系統的正確的文件,由於擴展,庫加載到內存中,執行代碼,並打印出「咩」。 JNI找到這些文件是因爲它們位於PATH環境變量(或等價的系統)中。 PATH包括執行的代碼/程序所在的文件夾,以java.library.path系統屬性設置的文件夾以及包含在PATH變量本身中的文件夾。

基本上,您只需要擔心有關PATH的部分,因爲一切都是爲您完成的!

+0

你可以發佈一些示例代碼來推動我朝着正確的方向發展嗎? – John 2012-08-09 03:37:09

+0

@John有幫助嗎? – yodal 2012-08-09 20:33:12

+0

如何獲取/生成Java3D的DLL? – John 2012-08-10 00:08:54

1

如果您要將它分發到磁盤上,則可以將應用程序包裝爲安裝可執行文件(例如使用免費的Inno Setup)。一旦用戶放入磁盤,安裝程序就會開始。您可以在Inno Setup中配置您的設置以安裝正確版本的Java3D。

我認爲這是大多數磁盤分佈式遊戲的工作原理。它需要一點點才能獲得更高級的設置包裝,但它們是值得的。除了Inno Setup,我什麼都不知道,但它能夠處理我迄今爲止的任何要求,這就是爲什麼我推薦它。

+0

如果我包裝它,那麼它只能在Windows上運行,我希望它能夠在許多不同的系統上運行,這就是爲什麼我將程序打包到Jar文件中的原因。 – John 2012-08-08 23:52:09

+0

我確定有一些平臺獨立的安裝包裝?我猜Java3D對於不同的操作系統也有不同的安裝程序。所以我不認爲你會分開處理你想分別支持的每一個操作系統......這些設置包裝只是簡化了這個任務...... – brimborium 2012-08-09 09:00:41