j2sdk Document에 나온 예제중에요..
j2sdk Doc를 보다가 좀 이상한 부분이 있어서 질문드립니다.
제가 질문드리고 싶은 부분은...
Lesson: Interacting with Java from the Native Side
에 나오는 예제중에 하나인데요..
제목에서 보시다시피 Native 모드를 사용에 관련된 부분입니다.
class Prompt { private native String getLine(String prompt); public static void main(String args[]) { Prompt p = new Prompt(); String input = p.getLine("Type a line: "); System.out.println("User typed: " + input); } static { System.loadLibrary("MyImpOfPrompt"); } }
와 같이 자바코드를 만들었구요..
javah Prompt 를 통해서
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class Prompt */ #ifndef _Included_Prompt #define _Included_Prompt #ifdef __cplusplus extern "C" { #endif /* * Class: Prompt * Method: getLine * Signature: (Ljava/lang/String;)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_Prompt_getLine (JNIEnv *, jobject, jstring); #ifdef __cplusplus } #endif #endif
와 같이 header가 생성되구요..
#include <stdio.h> #include <jni.h> #include "Prompt.h" JNIEXPORT jstring JNICALL Java_Prompt_getLine(JNIEnv *env, jobject obj, jstring prompt) { char buf[128]; const char *str = (*env)->GetStringUTFChars(env, prompt, 0); printf("%s", str); (*env)->ReleaseStringUTFChars(env, prompt, str); scanf("%s", buf); return (*env)->NewStringUTF(env, buf); }
이와같은 c파일을 만들어서 여기에 있는 함수를 java에서 사용한다는 내용입니다.
그런데 c파일에 함수를 보면..Java_Prompt_getLine(JNIEnv *env, jobject obj, jstring prompt)
와 같이 JNIEnv* 타입으로 env를 받죠..
그리고
const char *str = (*env)->GetStringUTFChars(env, prompt, 0);
이런식으로 사용합니다.
env가 pointer 타입이니까..env->GetStringUTFChars(env, prompt, 0);
이렇게 되어야 하는게 아닌가 하는게 제 질문입니다.
참고로 위의 예제는 j2sdk Document에서 나온 예제구요..
실제로 저렇게 하면 컴파일이 성공적으로 됩니다.
그런데 위의 코드를 조금 변환해서 제가 사용해보니까..
위의 부분에서 base operand of '->' has non-pointer type 'JNIEnv_'
와 같은 에러가 납니다
과연 어떤게 맞는건가요?
답변 부탁드립니다.
jni.h를 열어서 찾아 보시면 금방 아실 수 있습니다...
jni.h를 열어서 찾아 보시면 금방 아실 수 있습니다...
노루가 사냥꾼의 손에서 벗어나는 것 같이, 새가 그물치는 자의 손에서 벗어나는 것 같이 스스로 구원하라 -잠언 6:5
댓글 달기