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
댓글 달기