是否可以在C++程序中編譯.java文件(假定.java文件已提供給我)?如果是這樣,怎麼樣?如何使用C++編譯.java文件
回答
可以使用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字節碼很容易理解,並且類文件格式是可公開訪問的。
假設你的意思是包含在你的C++程序運行編譯的Java類:
你可以使用JNI,這主要是用來解決問題逆轉(從Java運行本地代碼)。
看看http://java.sun.com/docs/books/jni/html/invoke.html詳細說明如何創建JNI環境以及如何在Java代碼中調用方法。
對於JVM的JNI啓動開始,但不要忘記抓取編譯器的工具最近才被引入。 –
我不確定OP是否真的想從C++編譯java源代碼,我假定他想「將java編譯成C++」,即從類文件運行java字節碼。 – mvds
我不確定OP是否真的想將java編譯成C++,我的意思是說他如何讓C++編譯Java。 –
你可以通過你的應用程序中嵌入一個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++。
在哪個包含文件中,您通常會找到類似「JavaCompiler」的類? – hirschhornsalz
@drhirsch在我意識到的任何包含文件中,您不會找到類「JavaCompiler」。這個例子展示瞭如何使用'#include
- 1. 使用Java程序編譯Java文件
- 2. 如何在Java中編譯.java文件?
- 3. 使用Java編譯器API來編譯多個java文件
- 4. 如何從C#編譯Java?
- 5. 用C++編譯器編譯C99文件
- 6. 如何以編程方式使用Roslyn編譯C#文件?
- 7. Java和C:如何將此C源文件編譯爲用於Java的DLL?
- 8. 用C編譯java#
- 9. 編譯java文件
- 10. 編譯Java文件
- 11. 調試java文件編譯(使用gwt)
- 12. 無法使用cygwin編譯java文件
- 13. 編譯Java文件,使用Windows Cmd的
- 14. 反編譯.java文件使用Proycon
- 15. 使用javac編譯java文件
- 16. 從Java類編譯C文件
- 17. 如何編譯單個Java文件
- 18. 如何編譯我的Java源文件
- 19. 如何「反編譯」Java類文件?
- 20. C++編譯文件
- 21. 編譯C文件
- 22. 使用編譯C文件jni.h
- 23. 使用C編譯Excel文件#
- 24. 編譯C++文件使用PHP
- 25. 使用MEX編譯C++文件
- 26. 編譯器如何使用lib文件?
- 27. 如何使用maven編譯atl文件
- 28. 如何使用Android.mk編譯Cmake文件?
- 29. 如何使用cmake編譯.fx文件
- 30. 使用Java文件中的代碼編譯Java文件
運行命令行? javac –
,或者你可以用C++編寫一個用於Java語言的編譯器;) – hage
你爲什麼要這麼做? – Tom