앞서 C++에서 JNI를 사용하기위해 프로젝트 셋팅작업을 끝냈습니다.

이번에는 간단하게 Java class를 생성하여 클래스안에 있는 메서드를 호출하는 예제를 만들어보겠습니다. 

코드는 어려운게 없으니 천천히 따라오시면 쉽게 구현하실수 있습니다.




1. Hello.class 만들기


public class Hello {
	void sayHello() {
		System.out.println("Say HELLOOO");
	}
}


생성자가없는 Hello.java 파일입니다. 간단하게 sysout으로 인사말을 프린트 하는 메서드입니다. 위의 코드를 코딩하셔서 java파일로 만드시고

javac 명령어를 사용하여 java파일은 class파일로 컴파일 시켜주세요


javac Hello.java


위에서 생성한 Hello.class파일을 C:\Java\src 경로에 넣어주세요! 해당 경로는 c++ 에서 java 클래스파일을 읽어올 경로입니다. c++ 프로젝트 내부에 상대경로로 설정하셔도 됩니다만 저는 C드라이브 밑에  간단하게 테스트용으로 생성했습니다.



2. c++ 코딩


#include 
#include 
#include "stdafx.h"
#include 

using namespace std;

void main() {
	// JavaVM 생성 & JVM 환경설정
	JavaVMOption options;
	JavaVMInitArgs vm_args;
	JNIEnv *env;
	JavaVM *jvm;
	long status;

	options.optionString = "-Djava.class.path=C:\\Java\\src"; // 자바 클래스파일이 있는 경로
	memset(&vm_args, 0, sizeof(vm_args));
	vm_args.version = JNI_VERSION_1_6;
	vm_args.nOptions = 1;
	vm_args.options = &options;
	status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);

	cout << "JVM 구동!" << endl;
	jclass cls;
	jmethodID mid;
	jobject obj;
	int staticresult = 0;
	int result = 0;

	if (status != JNI_ERR)
	{
		cls = env->FindClass("Hello");		// Hello.class를 찾아 jclass를 생성한다.

		if (cls != 0)
		{
			jmethodID cls_constructor = env->GetMethodID(cls, "", "()V");		// Hello.class의 기본생성자를 찾아 생성자 메소드를 생성한다.
			if (cls_constructor != 0) {
				obj = env->NewObject(cls, cls_constructor, "()V");		// 클래스와 클래스 생성자를 이용해 객체(object)를 생성한다.
				mid = env->GetMethodID(cls, "sayHello", "()V");			// Hello.class에 정의한 sayHello() 메소드를 찾아 JmethodID 담는다.
				env->CallIntMethod(obj, mid);							// 메소드를 호출하는데 GetMethodID 함수를 이용해 위의 JmethodID를 파라메터로 넘겨준다.
			}
		}
		else
		{
			cout << "클래스를 찾을 수 없습니다." << endl;
			return;
		}

		jvm->DestroyJavaVM();
		cout << "JVM 삭제" << endl;
	}
}

}


간단하게 메인함수에서 호출하게 만들어봤습니다. 1편에서 셋팅을 제대로 하셨다면 컴파일 에러가 없으실꺼에요~


Posted by 루우지