본문 바로가기

TroubleShooting/JNI

jni 로 작성한 c 파일에서 "request for member in something not a structure or union" 컴파일 오류가 날때

728x90

jni 로 작업할 일이 있었는데 설정 방법을 잘 몰라서인지 의외로 컴파일 오류가 많이 발생한다.


$ gcc -shared -o libjnifuncs.so jnifuncs.c -I$JAVA_HOME/include -I$JAVA_HOME/include/linux -fPIC

jnifuncs.c: In function ‘Java_jnifuncs_makeIntArray’:

jnifuncs.c:21: error: request for member ‘NewIntArray’ in something not a structure or union

jnifuncs.c: In function ‘Java_jnifuncs_setIntArray’:

jnifuncs.c:44: error: request for member ‘GetArrayLength’ in something not a structure or union

jnifuncs.c:53: error: request for member ‘SetIntArrayRegion’ in something not a structure or union


예제를 참조했는데, env->NewIntArray() 를 찾지못한다는 오류이다.

jnifuncs.c  파일 :


JNIEXPORT jintArray JNICALL Java_jnifuncs_makeIntArray

  (JNIEnv *env, jclass cls, jint arr_len)

{

    jintArray ji_array = NULL;

    ji_array = env->NewIntArray(arr_len);


    if (ji_array != NULL) {

        printf("In JNI >> fail make new int array\n");

        return ji_array;

    }

    else {

        printf("In JNI >> fail make new int array\n");

        return NULL;

    }

}



검색을 통해 확인해보니, "env->XXXX" 는 cpp 확장자일 경우에만 사용하고, c 확장자일 경우에는 "(*env)->XXXX(env, yyyy)" 형태로 수정이 필요하다고 한다.

그냥 파일을 c++ 로 컴파일시키기 위해,  jnifuccs.c 를 jnifuncs.cc 로 파일 이름을 변경하고 컴파일하면 아무 문제가 없다.

$ mv jnifuncs.c jnifuncs.cc

$ gcc -shared -o libjnifuncs.so jnifuncs.cc -I$JAVA_HOME/include -I$JAVA_HOME/include/linux -fPIC


참고 :

https://forums.oracle.com/forums/thread.jspa?messageID=6466298

'TroubleShooting > JNI' 카테고리의 다른 글

HelloWorld jni 테스트 in linux  (0) 2012.07.24