是否可以在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