기본형에 이어 기본 변수형은 아니지만 그만큼 자주 사용되는 string 에 대한 interface 를 알아보겠습니다.

JNI 에서는 char 의 배열이 아니라 string 에 대한 별도의 interface 들을 제공하고 있습니다.


===== (3) 문자열 다루기 ============================================================

1. jstring


JNI 에서는 기본 변수형 타입 외에 string 을 위해 jstring 이라는 변수 타입을 제공한다.

jstring 을 이용해서 c/c++ 의 char *로 변환해서 사용할 수 있다.


2. 예제 소스


MainStart.java 

public class MainStart {

        public static void main(String[] args) {

                String str = new String("Hello, FALinux !");


                JniFunctions.printString(str);

        }


JniFunctions.java 

public class JniFunctions {

        static {

                System.loadLibrary("mylib");

        }


        public static native int printString(String str);


java 에서의 사용은 일반 string class 를 사용하는 것과 다르지 않다.


JniFunctions.cpp

#include <jni.h>

#include <stdio.h>


#ifdef __cplusplus

extern "C" {

#endif


JNIEXPORT jint JNICALL Java_JniFunctions_printString

        (JNIEnv *env, jclass cls, jstring jstr)

{

        const char *str = env->GetStringUTFChars(jstr, NULL);

        printf("string is [%s]\n",str);

        env->ReleaseStringUTFChars(jstr, str);

        return 0;

}


#ifdef __cplusplus

}

#endif 


c++ 에서는 jstring 을 이용해서 GetStringUTFChars() 함수를 통해 char * 로 변환된 문자열을 얻을 수 있다.

그리고 사용후에는 반드시 release 할 것을 권고하고 있다. ReleaseStringUTFChars()

release 하지 않는다고 당장 문제가 되지는 않지만 반복적으로 자주 사용할 경우 문제를 발생시킨다.


3. 컴파일 & 실행.


$ javac JniFunctions.java

$ javac MainStart.java

$ g++ -shared -o libmylib.so JniFunctions.cpp -I/usr/lib/jvm/java-6-openjdk/include/ -I/usr/lib/jvm/java-6-openjdk/include/linux/

$

$ export LD_LIBRARY_PATH=./

$ java MainStart 

string is [Hello, FALinux !]


=============================================================================