2012-05-09 17 views
1

.javaファイルをC++プログラムでコンパイルすることはできますか(.javaファイルが与えられたと仮定します)?もしそうなら、どうですか?C++を使用して.javaファイルをコンパイルする方法

+7

コマンドラインを実行しますか? javac –

+1

またはJava言語用にC++でコンパイラを書くことができます; – hage

+0

なぜこれをやろうとしていますか? – Tom

答えて

0

C++を使用してJavaモジュールをコンパイルすることは可能です。 UNIX/Linuxでは、C++にfork()/exec() C関数を使用して、javacコンパイラを別のプロセスで起動させることができます。 Windowsでは、CREATEPROCESS機能を使用できます。

その他の手法には、シェルを起動してからjavacを呼び出す方法があります。これは、入出力プログラムを「起動」プログラムと統合するための作業をしたくないときに使用されます。

C/C++プロセスで既存のJNI(Java Native Interface)を使用して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 JavaコードでJNI環境を作成する方法とメソッドを呼び出す方法の詳細については、http://java.sun.com/docs/books/jni/html/invoke.htmlを参照してください。

+0

+1 JVMのJNIキックスタートについては、コンパイラをつかむための機能が最近になって導入されたことを忘れないでください。 –

+0

私はOPが本当にC++からJavaソースコードをコンパイルしたいとは思っていませんが、「javaをC++にコンパイルしたい」と思っていました。つまり、クラスファイルからjavaバイトコードを実行するだけです。 – mvds

+0

私はOPが本当にJavaをC++にコンパイルしたいとは思っていません。つまり、C++にJavaをコンパイルする方法を説明しました。 –

0

は、あなたのアプリケーション内でJVMを埋め込み、JavaCompilerのメソッドを取得し、呼び出すために(未テスト)JNIの少しを書き込むことによってこれを行うことができます。

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から見上げました。 JNI経由でC++に

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 
int compilationResult = compiler.run(null, null, null, "my_file.java"); 

だから基本的には以前のC++コードは、直接翻訳したものです。

+0

インクルードファイルには、通常、 'JavaCompiler'のようなクラスがありますか? – hirschhornsalz

+0

@drhirsch私が知っているインクルードファイルでは、 'JavaCompiler'クラスは見つかりません。この例は '#include 'を使ってC++で示されたJavaコードを書く方法を示しています。最初のビットはJavaとまったく同じことを行うC++ですが、C++(またはC)インターフェイスからのものです。 – Flexo

関連する問題