2012-05-09 103 views
1

是否可以在C++程序中編譯.java文件(假定.java文件已提供給我)?如果是這樣,怎麼樣?如何使用C++編譯.java文件

+7

運行命令行? javac –

+1

,或者你可以用C++編寫一個用於Java語言的編譯器;) – hage

+0

你爲什麼要這麼做? – Tom

回答

0

可以使用C++編譯Java模塊。在UNIX/Linux中,可以讓C++使用C函數在單獨的進程中啓動javac編譯器。在Windows中,您可以使用CREATEPROCESS功能。

其他技術包括啓動一個shell然後調用javac。當您不想進行更多的工作來將輸入和輸出與「啓動」程序集成時,就會使用它。

您還可以利用現有的JNI(Java本地接口)在您的C/C++進程中啓動JVM。在這樣的解決方案下,您可以使用新的Java 1.6工具來獲取工具鏈編譯器。一旦你有了編譯器,你可以通過JNI調用來編譯你的源代碼。

javac程序是開源的。在合適的條件下(如果您正在開發與GPL兼容的產品),您可以直接將HotSpot代碼集成到您的程序中。最後,如果你只編譯Java的一小部分,你也可以編寫你自己的編譯器。 JVM字節碼很容易理解,並且類文件格式是可公開訪問的。

1

假設你的意思是包含在你的C++程序運行編譯的Java類:

你可以使用JNI,這主要是用來解決問題逆轉(從Java運行本地代碼)。

看看http://java.sun.com/docs/books/jni/html/invoke.html詳細說明如何創建JNI環境以及如何在Java代碼中調用方法。

+0

對於JVM的JNI啓動開始,但不要忘記抓取編譯器的工具最近才被引入。 –

+0

我不確定OP是否真的想從C++編譯java源代碼,我假定他想「將java編譯成C++」,即從類文件運行java字節碼。 – mvds

+0

我不確定OP是否真的想將java編譯成C++,我的意思是說他如何讓C++編譯Java。 –

0

你可以通過你的應用程序中嵌入一個JVM和寫作(未經測試)JNI的一點點對JavaCompiler獲取和調用一個方法做到這一點:

jclass provider = env->FindClass("javax/tools/ToolProvider"); 
jmethodID providermid = env->GetStaticMethodID(provider, "getSystemJavaCompiler", "()Ljavax/tools/JavaCompiler"); 
jobject compiler = env->CallStaticVoidMethod(provider, providermid); 

jclass cls = env->GetObjectClass(compiler); 
jmethodID compilermid = env->GetMethodID(cls, "run", "(Ljava/io/InputStream;Ljava/io/OutputStream;Ljava/io/OutputStream;[Ljava/lang/String;)I"); 

jstring filename = env->NewStringUTF(env, "my_file.java"); 
env->CallIntMethod(compiler, compilermid, NULL, NULL, NULL, filename); 

編譯器從ToolProvider擡頭。

所以基本上前面的C++代碼是直接翻譯過來的:

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 
int compilationResult = compiler.run(null, null, null, "my_file.java"); 

成通過JNI C++。

+0

在哪個包含文件中,您通常會找到類似「JavaCompiler」的類? – hirschhornsalz

+0

@drhirsch在我意識到的任何包含文件中,您不會找到類「JavaCompiler」。這個例子展示瞭如何使用'#include '來編寫C++中顯示的Java代碼。第一位是C++,它與Java完全相同,但是來自C++(或C)接口。 – Flexo