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
'Engineering > JNI' 카테고리의 다른 글
HelloWorld jni 테스트 in linux (0) | 2012.07.24 |
---|