jni.h를 찾는 방법?
Ubuntu 12.04에는 sun / oracle의 jdk7이 설치되어 있습니다. 때 locate jni.h
, 그것은 여러 위치를 인쇄
/usr/lib/jvm/java-6-openjdk-amd64/include/jni.h
/usr/lib/jvm/jdk1.7.0_07/include/jni.h
...
JDK에서 생성 한 헤더 파일에는이 include <jni.h>
있으며 현재 불평합니다.
fatal error: jni.h: No such file or directory.
내에서 Makefile
, 위치의 더 사양이없는 jni.h
것입니다. 그리고 컴파일 할 때 jni.h
(예를 들어 /usr/lib/jvm/jdk1.7.0_07/include/jni.h
)의 경로를 알 수 있도록 특정 시스템 매개 변수를 구성 할 수 있는지 묻습니다 .
컴파일러에게 include 디렉토리가 어디에 있는지 알려줘야합니다. 이 같은:
gcc -I/usr/lib/jvm/jdk1.7.0_07/include
그러나 그것은 당신의 makefile에 달려 있습니다.
파일 jni.h
과 jni_md.h
파일이 모두 필요합니다.
gcc -I/usr/lib/jvm/jdk1.7.0_07/include \
-I/usr/lib/jvm/jdk1.7.0_07/include/linux filename.c
여기에는 광범위한 JNI 파일과 Linux에 필요한 파일이 모두 포함됩니다.
OpenJDK 개발 키트 (JDK)를 설치하면 문제가 해결됩니다.
sudo apt-get install openjdk-X-jdk
이렇게하면 문제없이 컴파일 할 수 있습니다.
다음 코드를 사용하십시오.
make -I/usr/lib/jvm/jdk*/include
여기서 jdk *는 jdk 설치의 디렉토리 이름입니다 (예 : jdk1.7.0).
그리고 디렉토리 이름이 다운로드 및 설치된 JDK 빌드에 따라 다르기 때문에 시스템 전체의 솔루션이 없을 것입니다. 자동화 된 솔루션을 원하는 경우 모든 명령을 단일 스크립트에 포함하고 해당 스크립트를 터미널에서 실행하십시오.
JAVA_INCLUDE_DIR을 jni.h가있는 위치로 설정하면 문제가 해결됩니다 (CPPFLAGS 설정이 작동하지 않음).
/ usr / lib64 / java / include라고 가정합니다.
export JAVA_INCLUDE_DIR=/usr/lib64/java/include
일반적으로 JAVA_HOME 변수를 다음과 같이 정의합니다.
export JAVA_HOME=/usr/lib/jvm/java/
필요한 포함 파일이 있습니다. 필요한 많은 것들을 컴파일 할 때 가끔 .barshrc에 아래를 추가합니다.
게시 된 솔루션 중 어느 것도 나를 위해 일하지 않았습니다.
vi
내 Makefile 에 들어가서 include
폴더와 OS 하위 시스템 (내 경우에는 -I/usr/lib/jvm/java-8-openjdk-amd64/include/linux
)의 경로가 정확 하도록 경로를 편집 해야했습니다. 이 날은 실행을 허용 make
하고 make install
문제없이.
위의 답변은 하드 코딩 된 경로 솔루션을 제공합니다. 이것은 너무 많은 수준 (자바 버전 변경, OS 변경 등)에서 좋지 않습니다.
더 깨끗한 솔루션은 다음을 추가하는 것입니다.
JAVA_HOME = $(shell dirname $$(readlink -f $$(which java))|sed 's^jre/bin^^')
makefile 상단 근처에 다음을 추가하십시오.
-I$(JAVA_HOME)/include
포함 플래그에.
나는 같은 문제가 발생하고 잘못된 답변을 찾기 위해 너무 많은 시간을 보냈기 때문에 이것을 게시하고 있습니다 (여러 플랫폼에서 앱을 구축하고 있으므로 빌드 환경이 이동 가능해야 함).
저에게는 JDK 설치를 포함시키는 것이 간단한 문제였습니다 (JRE 만있었습니다). 내 R CMD javareconf
출력은 다음과 같습니다.
Java interpreter : /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
Java version : 1.8.0_191
Java home path : /usr/lib/jvm/java-8-openjdk-amd64/jre
Java compiler : not present
Java headers gen.:
Java archive tool:
trying to compile and link a JNI program
detected JNI cpp flags :
detected JNI linker flags : -L$(JAVA_HOME)/lib/amd64/server -ljvm
gcc -std=gnu99 -I/usr/share/R/include -DNDEBUG -fpic -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g -c conftest.c -o conftest.o
conftest.c:1:17: fatal error: jni.h: No such file or directory
compilation terminated.
/usr/lib/R/etc/Makeconf:159: recipe for target 'conftest.o' failed
make: *** [conftest.o] Error 1
Unable to compile a JNI program
JAVA_HOME : /usr/lib/jvm/java-8-openjdk-amd64/jre
Java library path:
JNI cpp flags :
JNI linker flags :
Updating Java configuration in /usr/lib/R
Done.
And indeed there was no include
file in my $JAVA_HOME
. Very simple remedy:
sudo apt-get install openjdk-8-jre openjdk-8-jdk
(note that this is specifically intended to install the openJDK
and not the one from Oracle)
Afterwards all is well:
Java interpreter : /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
Java version : 1.8.0_191
Java home path : /usr/lib/jvm/java-8-openjdk-amd64/jre
Java compiler : /usr/lib/jvm/java-8-openjdk-amd64/jre/../bin/javac
Java headers gen.: /usr/lib/jvm/java-8-openjdk-amd64/jre/../bin/javah
Java archive tool: /usr/lib/jvm/java-8-openjdk-amd64/jre/../bin/jar
trying to compile and link a JNI program
detected JNI cpp flags : -I$(JAVA_HOME)/../include -I$(JAVA_HOME)/../include/linux
detected JNI linker flags : -L$(JAVA_HOME)/lib/amd64/server -ljvm
gcc -std=gnu99 -I/usr/share/R/include -DNDEBUG -I/usr/lib/jvm/java-8-openjdk-amd64/jre/../include -I/usr/lib/jvm/java-8-openjdk-amd64/jre/../include/linux -fpic -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g -c conftest.c -o conftest.o
g++ -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions -Wl,-z,relro -o conftest.so conftest.o -L/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server -ljvm -L/usr/lib/R/lib -lR
JAVA_HOME : /usr/lib/jvm/java-8-openjdk-amd64/jre
Java library path: $(JAVA_HOME)/lib/amd64/server
JNI cpp flags : -I$(JAVA_HOME)/../include -I$(JAVA_HOME)/../include/linux
JNI linker flags : -L$(JAVA_HOME)/lib/amd64/server -ljvm
Updating Java configuration in /usr/lib/R
Done.
I don't know if this applies in this case, but sometimes the file got deleted for unknown reasons, copying it again into the respective folder should resolve the problem.
참고URL : https://stackoverflow.com/questions/14529720/how-to-make-jni-h-be-found
'IT박스' 카테고리의 다른 글
자세한 메시지로 근본 원인을 찾기 위해 예외 getCause ()를 반복하는 방법 (0) | 2020.11.26 |
---|---|
Django Celery 로깅 모범 사례 (0) | 2020.11.25 |
개발, 스테이징 및 프로덕션 브랜치가있는 git (0) | 2020.11.25 |
완전히 오프라인으로 작동하도록 Android Studio를 설정하려면 어떻게해야합니까? (0) | 2020.11.25 |
신속하게 NSCoder를 사용하여 enum을 인코딩하는 방법은 무엇입니까? (0) | 2020.11.25 |