Hello JNI (4), C++ 버전
From Evernote: |
Hello JNI, C++ 버전 |
새로운 C++ 프로젝트를 만들고 C 프로젝트를 설정한 것과 마찬가지로 C++ 프로젝트를 설정해야 한다. 프로젝트 설정 창에서 C++ 컴파일러의 Include 항목에 JDK의 include 폴더 위치를 지정한다. 그외에 다른 설정 사항들은 C 프로젝트와 동일하다.
자바 소스 파일에는 네이티브 함수 하나만을 정의해 두었고 다음과 같다. 자바에서 매개변수로 문자열을 전달해 줄 것이고, C++에서는 이 문자열을 받아서 적당한 처리를 한 후에, 다시 자바 쪽으로 돌려줄 것이다. 자바에서는 돌려 받은 문자열을 화면에 출력한다.
package kr.pe.elex.example.jni;
/**
* JNI 테스트
*
* @version 4
* @author Elex
*/
public class HelloJni {
static {
System. loadLibrary("libhellojnicpp");
}
/**
* 네이티브 라이브러리로 문자열을 넘겨주면,
* C++에서는 문자열을 처리한 후,
* 다시 자바쪽으로 문자열을 넘겨준다.
*
* @param str
* @return
*/
private native String jni(String str);
public static void main(String[] args) {
HelloJni test = new HelloJni();
System. out.println(test.jni("Hello Jni" ));
}
}
이후 작성된 자바 클래스 파일로부터 헤더 파일을 추출하고, 헤더 파일에 정의된 함수 원형에 따라 C++ 소스파일을 작성한다. (윈도우즈의 경우 함수명 앞에 밑줄 문자를 추가하는 것을 잊지 말 것.)
#include <string>
#include "kr_pe_elex_example_jni_HelloJni.h"
using namespace std;
JNIEXPORT jstring JNICALL
_Java_kr_pe_elex_example_jni_HelloJni_jni (JNIEnv *env, jobject obj, jstring str)
{
const char* s = env->GetStringUTFChars(str, NULL);
string newStr (s);
env->ReleaseStringUTFChars(str, s);
newStr.append(" from C++" );
return env->NewStringUTF( newStr.c_str());
}
#. 자바 문자열 객체를 가져와서, C++ 문자열로 만든 다음, 다른 문자열을 추가하고, 자바쪽으로 문자열을 돌려준다.
#. JNIEnv의 멤버 메서드를 사용할 때에, C에 비해 C++에서는, 매개변수의 갯수가 줄어들어 좀 더 깔끔하다는 차이점이 있다.
<프로젝트 파일>
http://www.elex.pe.kr/attachment/cfile3.uf@2352814E523104F50C27F2.7z
http://www.elex.pe.kr/attachment/cfile3.uf@2352814E523104F50C27F2.7z
댓글
댓글 쓰기