JNI 인터페이스에서 .DLL 또는 shared object를 생성할 때 컴파일 과정에서 jni.h를 찾을 수 없어서 C컴파일을 하지 못하는 경우
1) 문제 발생 원인
jdk를 설치하면 java에서 제공하는 JNI 인터페이스 파일이 "include/jni.h"이 INCLUDE 경로에 있어야 하는데 INCLUDE 경로에 jdk의 include 디렉토리가 설정되지 않았기 때문에 발생하는 문제이다.
2) include 설정에 필요한 jni 관련 파일이 2개 있는데 그 위치는 아래와 같다 --> 윈도용 jdk 기준으로...
C:\Program Files (x86)\Java\jdk1.7.0_21\include\jni.h
C:\Program Files (x86)\Java\jdk1.7.0_21\include\win32\jni_md.h
3) 윈도에서 jdk의 include 디렉토리 설정 방법 --> Visual Studio 6.0 기준으로...
Tools-Options의 Directories 탭에 "Show directories for:"의 "Include files"에 아래 2개 디렉토리를 추가해 주면 된다.
C:\Program Files (x86)\Java\jdk1.7.0_21\include
C:\Program Files (x86)\Java\jdk1.7.0_21\include\win32
그러면 C/C++ 컴파일러가 컴파일할 때 #include <jni.h>를 이 디렉토리에서 찾아서 컴파일을 해 준다.
<참고> Linux에서 jdk의 include 디렉토리 2개의 위치는 아래와 같으며, INCLUDE 경로에 이 2개 디렉토리를 추가해 주면 된다.
/usr/lib/jvm/java-1.6.0/include
/usr/lib/jvm/java-1.6.0/include/linux
INCLUDE 경로 설정을 잘 모르는 경우에는 아래와 같이 컴파일할 때 include path를 직접 설정하여 컴파일하면 된다.
$ gcc -fPIC -c jni-filename.c -I/usr/lib/jvm/java-1.6.0/include -I/usr/lib/jvm/java-1.6.0/include/linux
첫댓글 linux에서 특정 파일/디렉토리 찾는 방법은 find 명령을 사용하면 됩니다. 예를 들어, jvm 또는 jni.h를 찾을 때
$ find / -name jvm -print
$ find / -name jni.h -print
'/'는 찾을 범위(디렉토리) -- '/'인 경우 root 아래 모든 디렉토리를 검색함