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



이 블로그의 인기 게시물

좌표 변환: 회전 이동

Unmappable character for encoding MS949

Hello JNI (3), C 라이브러리에 문자열 전달