강좌 & 팁
기본형에 이어 기본 변수형은 아니지만 그만큼 자주 사용되는 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 !] |
=============================================================================