.javaファイルをc++プログラムでコンパイルすることは可能ですか(.javaファイルが私に与えられていると仮定して)?もしそうなら、どのように?
3 に答える
コンパイルされたJavaクラスをC++プログラムに含めて実行することを意図していると仮定します。
JNIを使用できます。これは、主に逆の問題(Javaからネイティブコードを実行する)を解決するために使用されます。
JNI環境を作成する方法と、Javaコードでメソッドを呼び出す方法の詳細については、 http://java.sun.com/docs/books/jni/html/invoke.htmlを参照してください。
C++を使用してJavaモジュールをコンパイルすることができます。UNIX / Linuxでは、C++でfork()
/ exec()
C関数を使用してjavac
、別のプロセス内でコンパイラを起動できます。Windowsでは、CREATEPROCESS機能を使用できます。
他の手法には、シェルを起動してからを呼び出すことが含まれますjavac
。これは、入出力を「起動」プログラムと統合するためにこれ以上の作業を行いたくない場合に使用されます。
また、既存のJNI(Java Native Interface)を利用して、C /C++プロセスでJVMを開始することもできます。このようなソリューションでは、新しいJava1.6機能を使用してツールチェーンコンパイラを取得できます。コンパイラを入手したら、JNI呼び出しを介してコンパイラを呼び出して、ソースコードをコンパイルできます。
プログラムはjavac
オープンソースです。適切な条件下で(GPL互換のものを開発している場合)、HotSpotコードをプログラム内に直接統合できます。
最後に、Javaの小さなサブセットのみをコンパイルする場合は、独自のコンパイラーを作成することもできます。JVMバイトコードは非常に理解しやすく、クラスファイル形式は一般公開されています。
これを行うには、アプリケーション内に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++に変換します。