如何使用C ++编译.java文件

时间:2012-05-09 18:49:37

标签: java c++ compilation

是否可以在c ++程序中编译.java文件(假设.java文件是给我的)?如果是这样,怎么样?

3 个答案:

答案 0 :(得分:1)

假设您的意思是在C ++程序中包含并运行已编译的java类:

您可以使用JNI,它主要用于解决相反的问题(从Java运行本机代码)。

查看http://java.sun.com/docs/books/jni/html/invoke.html详细说明如何创建JNI环境以及如何在Java代码中调用方法。

答案 1 :(得分:0)

可以使用C ++编译Java模块。在UNIX / Linux中,您可以让C ++使用fork() / exec() C函数在单独的进程中启动javac编译器。在Windows中,您可以使用CREATEPROCESS工具。

其他技术包括启动一个shell,然后调用javac。当你不想做更多的工作来将输入和输出与“启动”程序集成时,可以使用它。

您还可以利用现有的JNI(Java Native Interface)在C / C ++过程中启动JVM。在这样的解决方案下,您可以使用新的Java 1.6工具来获取工具链编译器。一旦有了编译器,就可以通过JNI调用来调用它来编译源代码。

javac程序是开源的。在适当的条件下(如果您正在开发兼容GPL的东西),您可以直接在程序中集成HotSpot代码。

最后,如果您只编译Java的一小部分,您也可以编写自己的编译器。 JVM字节码非常容易理解,类文件格式可以公开访问。

答案 2 :(得分: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 ++。