web-dev-qa-db-ja.com

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)のパスが認識されるように特定のシステムパラメーターを構成するように求めています。

62
Richard

コンパイラーにincludeディレクトリがどこにあるかを伝える必要があります。このようなもの:

gcc -I/usr/lib/jvm/jdk1.7.0_07/include

ただし、メイクファイルに依存します。

38
jdb

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に必要なファイルの両方が含まれます。

20
yogesh singh

OpenJDK Development Kit(JDK)をインストールすると、問題が解決するはずです。

Sudo apt-get install openjdk-X-jdk

これにより、問題なくコンパイルできるようになります。

14
hgaronfolo

次のコードを使用します。

make -I/usr/lib/jvm/jdk*/include

ここで、jdk *はjdkインストールのディレクトリ名です(例:jdk1.7.0)。

また、ダウンロードしてインストールしたJDKのビルドが異なるとディレクトリ名が異なるため、システム全体のソリューションはありません。自動化されたソリューションが必要な場合は、すべてのコマンドを単一のスクリプトに含めて、ターミナルでそのスクリプトを実行してください。

6
user2925073

Java_INCLUDE_DIRをjni.hが配置されている場所に設定すると、問題が解決するはずです(CPPFLAGSの設定は機能しませんでした)

/ usr/lib64/Java/includeであると仮定します。

export Java_INCLUDE_DIR=/usr/lib64/Java/include
3
karanis

通常、次のようにJava_HOME変数を定義します。

export Java_HOME=/usr/lib/jvm/Java/

そこには必要なインクルードファイルがあります。必要なものをたくさんコンパイルするときに、.barshrcに時々以下を追加します。

2
Leo Ufimtsev

投稿されたソリューションはどれも私にとってはうまくいきませんでした。

Makefileにviし、includeフォルダーとOSサブシステム(私の場合は-I/usr/lib/jvm/Java-8-openjdk-AMD64/include/linux)へのパスが正しいようにパスを編集する必要がありました。これにより、makeおよびmake installを問題なく実行できました。

1
bphilipnyc

私にとっては、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.

そして実際、$Java_HOMEにはincludeファイルがありませんでした。非常に簡単な救済策:

Sudo apt-get install openjdk-8-jre openjdk-8-jdk

(これは、特にopenJDKおよびnotをOracleからインストールすることを意図していることに注意してください)

その後はすべて順調です:

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.
0
MichaelChirico

この場合、これが当てはまるかどうかはわかりませんが、不明な理由でファイルが削除されることがあります。それぞれのフォルダーに再度コピーすると、問題が解決します。

0
el científico

上記の回答は、ハードコーディングされたパスソリューションを提供します。これは非常に多くのレベル(Javaバージョンの変更、OSの変更など)で悪いです。

よりクリーンなソリューションは以下を追加することです:

Java_HOME = $(Shell dirname $$(readlink -f $$(which Java))|sed 's^jre/bin^^')

メイクファイルの上部近くに追加します:

-I$(Java_HOME)/include

インクルードフラグに。

同じ問題に遭遇し、間違った答えを探し回るのに時間がかかりすぎたので、これを投稿しています(ビルド環境をトランスポータブルにする必要があるため、複数のプラットフォームでアプリを構築しています)。

0
GrueMaster