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