是否可以在c ++程序中编译.java文件(假设.java文件是给我的)?如果是这样,怎么样?
答案 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 ++。