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
ただし、メイクファイルに依存します。
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 Development Kit(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に時々以下を追加します。
投稿されたソリューションはどれも私にとってはうまくいきませんでした。
Makefileにvi
し、include
フォルダーとOSサブシステム(私の場合は-I/usr/lib/jvm/Java-8-openjdk-AMD64/include/linux
)へのパスが正しいようにパスを編集する必要がありました。これにより、make
およびmake install
を問題なく実行できました。
私にとっては、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.
この場合、これが当てはまるかどうかはわかりませんが、不明な理由でファイルが削除されることがあります。それぞれのフォルダーに再度コピーすると、問題が解決します。
上記の回答は、ハードコーディングされたパスソリューションを提供します。これは非常に多くのレベル(Javaバージョンの変更、OSの変更など)で悪いです。
よりクリーンなソリューションは以下を追加することです:
Java_HOME = $(Shell dirname $$(readlink -f $$(which Java))|sed 's^jre/bin^^')
メイクファイルの上部近くに追加します:
-I$(Java_HOME)/include
インクルードフラグに。
同じ問題に遭遇し、間違った答えを探し回るのに時間がかかりすぎたので、これを投稿しています(ビルド環境をトランスポータブルにする必要があるため、複数のプラットフォームでアプリを構築しています)。