IT박스

jni.h를 찾는 방법?

itboxs 2020. 11. 25. 07:48
반응형

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.hjni_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

반응형