2012-03-15 66 views
3

一個典型的C程序將被編譯,彙編,鏈接和加載。我知道Java與JVM協同工作並生成字節碼。是否有可能使用鏈接器連接兩個「目標文件」?例如,一個C程序和一個C++程序可以通過使用鏈接器並鏈接兩個目標文件一起使用。Java編譯器對象代碼(字節代碼?)

C和Java可以做同樣的事嗎?

回答

5

您不能將編譯的C代碼與編譯的Java代碼直接鏈接。

你可以調用編譯的C或C++從Java代碼中使用Java Native Interface (JNI)

Java本機接口(JNI),可編寫的代碼與代碼的Java編程語言編寫的其他語言如C融合和C++。它允許程序員充分利用Java平臺而不必放棄對遺留代碼的投資。

+2

+1或JNA,如果你不想寫C代碼:https://github.com/twall/jna – 2012-03-15 17:01:15

3

如果您將C代碼編譯爲JVM字節碼,而不是本地代碼,那麼這可能是可能的,因此您可以在JVM級別「鏈接」,而不是通過本機對象鏈接器。

http://en.wikipedia.org/wiki/Java_virtual_machine#C_to_bytecode_compilers

+1

博客文章有幾個實現:http://depth-first.com/articles/ 2006/10/16 /編譯-C-to-Java的字節碼/ – 2012-03-15 17:03:41

+1

當然,C編譯成字節碼是不是真的ç - 在C許多法律的事情不是Java字節碼的法律。 – 2012-03-15 17:04:42

2

不,至少不會有任何的常用工具。 「對象文件」即javac產生是(非正式地)被稱爲「字節代碼」,並且是一個程序的用於堆機(不同於用於舊"P-Code"系統沒有太大的不同)與硬件無關的表示。

有可Java字節代碼轉換成可執行各種硬件架構的各種工具,但都是相當專業的 - 沒有,我知道的產生鏈接的模塊。

1

GCC可以編譯Java類文件,然後到可執行的彙編代碼using gcj

AFAIK,它不是有用的Java和C直接結合,但機器代碼必須最終是這樣的形式,正常的鏈接器可以理解的。您可能需要一些彙編程序膠水代碼才能在兩者之間進行調用。