2013-03-08 38 views
1

我正在編寫一個C++ dll(Visual Studio中的文件擴展名是.cpp,但代碼是C),它使用JNI加載和調用某些Java類的實例方法。因此,我的項目由C++源代碼和頭文件以及一些Java類文件(通過JNI使用的Java對象的類文件)組成。我想創建一個包含Java類文件的單個dll庫「在一個包中」。是否有可能將C和Java文件都放到dll中?使用JNI的Java類的DLL

+0

您當然可以帶一些.class文件,將它們打包到一個或多個JAR中,並將它們作爲數據包含在DLL中。您甚至可以啓動用於在DLL中運行Java字節碼的JVM。不過,我不完全確定你是否能夠在沒有(暫時)將它們寫入磁盤的情況下讓JVM加載你的類。我會讓有更多關於JVM回答的人知道。 – Michael 2013-03-08 15:20:48

+0

如果我將類文件添加爲「外部資源」,該怎麼辦? (我正在使用Microsoft Visual C++ 2010)。 – salvo 2013-03-08 15:22:40

+0

只要您正確設置了JVM的類路徑,聲音就可以運行。我不會發誓,因爲這不是我嘗試過的。 – Michael 2013-03-08 15:30:45

回答

1

這是完全可能的,但不一定直觀。我沒有測試過這個,但是如果你知道你在做什麼,我會想象它很容易工作。

首先,您需要一種方法將類文件的二進制文件打包到您擁有的本機二進制文件中,然後當然可以在任何時間點無縫讀取該塊。你如何實現這一點取決於你,沒有真正的「正確的方式」來做到這一點。這就是說,如果您可以獲得.class文件數據所在的內存句柄(加載DLL之後)並將其作爲byte[]ByteBuffer傳遞給Java,那麼您可以使用任何一個的ClassLoaderdefineClass過載以及呼叫findLoadedClass,然後最後loadClass

這將允許您從幾乎任何數據源的類加載。正如我之前提到的那樣,您如何爲班級存儲/檢索本地數據取決於您。

+0

你認爲是否可以使用GCJ生成目標文件編譯.java和.class文件,然後讓鏈接器將所有目標文件放到一個dll中?我的意思是使用GCJ生成本地二進制代碼而不是字節碼。 – salvo 2013-03-08 15:54:06

+0

可能,雖然如果您使用GCJ將Java字節碼編譯爲本地字節碼,但我不確定JVM是否會識別它並能夠使用'defineClass'加載它;我認爲它期望Java字節碼,儘管我可能完全錯誤。 就我個人而言,我會爲它編寫一個自定義打包程序,或者嘗試查找可以將輔助文件放入二進制文件的打包程序。 – Qix 2013-03-08 15:56:13