1

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

4

3 回答 3

1

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

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

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

于 2012-05-09T19:00:30.243 回答
0

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

其他技术包括启动一个 shell,然后调用javac. 当您不想做更多工作以将输入和输出与“启动”程序集成时,有时会使用此选项。

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

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

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

于 2012-05-09T19:01:36.750 回答
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++。

于 2012-05-09T19:16:29.943 回答