-자바에서 String은 16비트의 Unicode 문자 세트로 사용한다.
-C에서는 일반적으로 8비트의 문자열을 표현한다.
jstring의 잘못된 사용법 |
JNIEXPORT jstring JNICALL Java_Prompt_getLine(JNIEnv *env, jobject obj , jstring prompt) {
printf("%s", prompt);
...
} |
-자바의 String을 Native Method가 정상적으로 접근하고 조작하려면, 자바의 String을 Native Method가 인식 가능한 형태로 변환 시켜줘야 한다. JNI는 자바의 16비트 유니코드 문자열과 C언어의 8비트 문자열 사이의 변환을 위해 UTF-8 포맷을 사용한다. UTF-8 포맷은 자바가 사용하는 16비트 유니코드 중에서도 8비트만을 사용하여 표현되는 문자들은 ASCII코드로 표현하고, 그 외의 ASCII 코드로 표현 할 수 없는 문자들은 2개 혹은 3개의 8비트 묶음으로 쪼개어 표현한다.
-JNI는 Native Method가 자바의 String을 조작할 수 있도록 자바의 String과 UTF-8 포맷 사이의 변환과 같은 일을 처리해 주는 미리 정의된 함수를 제공 한다.
GetStringUTFChars 메서드 요약 |
const jbyte* GetStringUTFChars(JNIEnv* env, jstring str, jboolean* isCopy) : jstring을 UTF-8 포맷으로 인코딩한 문자 배열로 바꾸고, 그 배열의 포인터를 반환해 줍니다 jstring str : UTF-8 포맷으로 인코딩할 문자열을 나타냅니다. iboolean* isCopy : 복사본을 만들것인지 여부를 나타냅니다. |
NewStringUTF 메서드 요약 |
jstring NewStringUTF(JNIEnv* env, const char bytes[]) : UTF-8 포맷 문자열로부터 jstring을 구성해서 반환합니다. const char bytes[] : UTF 문자 배열을 나타냅니다. |
MessageType.java(jstring 사용 예제 자바 파일) |
public class MessageType { static { System.loadLibrary("message"); } public native String printMessage(String str); public static void main(String[] args) throws Exception { MessageType h = new MessageType(); System.out.println(h.printMessage("Type anything? : ")); } } |
C:\JavaExample\20>javac MessageType.java C:\JavaExample\20>javah MessageType |
MessageType.c(jstring 사용 예제 C 파일) |
#include <jni.h> #include "MessageType.h" #include <stdio.h> JNIEXPORT jstring JNICALL Java_MessageType_printMessage(JNIEnv* env, jobject obj, jstring msg) { char buf[128]; const char *str = (*env)->GetStringUTFChars(env, msg, 0); printf("%s", str); (*env)->ReleaseStringUTFChars(env, msg, str); scanf("%s", buf); return (*env)->NewStringUTF(env, buf); } |
C:\JavaExample\20>cl -Ic:\jdk1.3.1\include -Ic:\jdk1.3.1\include\win32 -LD MessageType.c -Femessage.dll C:\JavaExample\20>java MessageType Type anything? : Hi!jabook Hi!jabook |
-jstring타입의 msg를 GetStringUTFChars()함수를 사용해서 UTF-8 문자열로 변경해 준다.
-const char *str = (*env)->GetStringUTFChars(env, msg, 0);
-ReleaseStringUTFChars()함수를 사용해서 자원을 해지 시켜 준다.
-(*env)->ReleaseStringUTFChars(env,msg,str);
ReleaseStringUTFChars() 함수 |
void ReleaseStringUTFChars(JNIEnv* env, jstring msg, const jbyte bytes[]) : 가상머신에게 더 이상 UTF-8 포맷 문자열을 사용하지 않는다고 알려줍니다 jstring msg : 자바의 String 객체 const jbyte bytes[] : GetStringUTFChars 함수로부터 얻어진 UTF-8 포맷 문자열의 포인터 |
-GetStringUTFChars()함수를 사용하고 나면 반드시 ReleaseStringUTFChars()함수를 사용해서 사용이 끝났음을 명시적으로 자바가상머신에게 알려 줘야 한다.
-NewStringUTF()함수를 사용해서 자바의 유니코드 문자열로 만들어 반환 하고 있다.
-return (*env)->NewStringUTF(env,buf);
-Native Method의 첫번째 매개변수는 env포인터 였다. 이 포인터는 JNI가 미리 정의해 놓은 함수들을 참조하기 위해서 반드시 모든 Native Method가 첫번째로 가져야 하는 매개 변수이다. 또한 JNI가 제공하는 함수를 사용할 때도 첫번째 매개 변수로 이 포인터를 넘겨 줘야 한다. 이 포인터를 인터 페이스 포인터(interface pointer)라고 하는데, 이 인터페이스 포인터는 JNI가 제공하는 함수들을 참조하고 있는 포인터들의 테이블을 가리킨다.
-인터페이스 포인터를 사용하여 우리는 객체에 접근하기 위해 JNI가 제공하는 함수들을 사용 할 수 있다.
'개발 언어 > JAVA' 카테고리의 다른 글
[JNI] 배열혈 아규먼트 (0) | 2011.07.22 |
---|---|
[jni]객체의 메서드 실행하기 (0) | 2011.07.22 |
[jni]객체 필드에 접근하기 (0) | 2011.07.22 |
[jni] 숫자 인자와 변환값 (0) | 2011.07.22 |
[JNI] 단계별 설명 (기본) (0) | 2011.07.22 |