2010-05-08 83 views
1

我想在使用JNI,C/C++和調用API的Java程序的windows平臺下創建可執行文件,我已經爲我的程序創建了包含所有依賴項的jar文件。我想將它嵌入到exe文件中,我使用JNI調用API成功運行了簡單的主類(存在於文件系統中),我打算在C/C++程序中添加jar文件作爲資源。但我不知道如何運行該jar文件,一個選項是在文件系統上創建臨時jar文件並使用java運行它,但出於安全原因,我不想將我的jar文件公開給每個人,我該如何運行jar文件在使用JNI飛行?使用JNI創建java可執行文件?

+1

「我不想將我的jar文件暴露給所有人出於安全原因」通過將它放入exe文件並將exe文件發送給某人,您就會暴露它。 – 2010-05-08 14:02:04

+0

是的,但exe無法反編譯,就像字節碼 – Xinus 2010-05-08 14:11:31

+2

一樣容易。但是,如果您只是將JAR文件打包到.exe中,則無需「反編譯」即可將其解壓出來。 – Nate 2010-05-08 15:18:44

回答

2

將Java編譯爲使用GCJ的可執行文件不能一直工作,使用反射和其他項目(如UI類Look at this page)時存在限制。

如果您將Java代碼轉換爲庫或其他模塊,那麼您可以鏈接到它並簡單地運行它,而不需要JVM。

+0

反思應該與OP正在追求的戰略一致。 – 2010-05-08 13:53:27

+0

@Kevin Day--我猜你是因爲把反射放在那裏。你沒有按照我的鏈接指向GCJ。我已經編輯了我的帖子,因爲它使得它更加明確:( – 2010-05-08 14:27:03

+0

Fair'nough認爲ding顛倒了;-) – 2010-05-09 02:49:13

1

我最初的反應是,如果你能得到這個工作並保持高性能,我會感到震驚。但後來我開始考慮它,也許你可以使用自定義類加載器來解決這個問題。如果您將jar作爲資源嵌入到exe文件中,它將與在任何文件(無論是否是exe文件)中的某個特定偏移量處存在jar字節完全相同。

所以,這裏有一個潛在的策略:實現一個自定義類加載器,它接受該文件中的jar資源的exe路徑和偏移量。這將使用ZipFile的自定義版本,它使用固定的索引偏移量來讀取它(不幸的是,它不可能使用ZipFile本身 - 但是如果你抓取ZipFile的源代碼,它應該是非常明顯的地方,需要添加偏移量)。

這裏有一個引導問題(你如何加載自定義類加載器?) - 但我認爲可能從JNI方面做到這一點。基本上你會將加載器的.class文件作爲exe文件中的一個單獨的資源存儲,並將其完全加載到內存中,然後使用JNI調用來構造它。這將是一個麻煩,但它只適用於一個類,然後您可以讓Java運行時接管其餘部分。

聽起來像一個有趣的項目(雖然,正如其他人指出的那樣,你在做什麼沒有太多安全性......我想你可以加密嵌入的jar並將加密代碼添加到類加載器中,但你有點兒需要決定你想要拿多少東西)。