본문 바로가기

개발 언어/JAVA

[jni]문자열 전달 인자


-자바에서 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가 제공하는 함수들을 사용 할 수 있다.

 

 


 
 
 
 
 
 
 
http://blog.naver.com/kittenjun/10003051683

'개발 언어 > 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