2012-05-09 78 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