2012-05-09 2 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++ 프로그램에서 컴파일 된 자바 클래스를 실행하는 데 의미 가정 :

당신은 대부분 반전 문제를 해결하는 데 사용되는 JNI를 사용할 수 있습니다 (자바에서 네이티브 코드를 실행).

JNI 환경을 만드는 방법과 Java 코드에서 메소드를 호출하는 방법을 자세히 설명한 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

include 파일에서 보통'JavaCompiler'와 같은 클래스를 찾으십니까? – hirschhornsalz

+0

@drhirsch 내가 알고있는 모든 포함 파일에서'JavaCompiler' 클래스를 찾을 수 없습니다. 이 예제는'#include '을 사용하여 C++에 표시된 Java 코드를 작성하는 방법을 보여줍니다. 첫 번째 비트는 자바와 똑같은 일을하지만 C++ (또는 C) 인터페이스에서 오는 C++입니다. – Flexo

관련 문제