Ric*_*ard 64 java java-native-interface classpath
在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
...
Run Code Online (Sandbox Code Playgroud)
在JDK生成的头文件中,有include <jni.h>,并且目前它抱怨
fatal error: jni.h: No such file or directory.
Run Code Online (Sandbox Code Playgroud)
在我看来Makefile,没有关于位置的规范jni.h.我问是否有可能配置某些系统参数以使jni.h(例如/usr/lib/jvm/jdk1.7.0_07/include/jni.h)在编译时知道路径.
jdb*_*jdb 39
您必须告诉编译器include目录在哪里.像这样的东西:
gcc -I/usr/lib/jvm/jdk1.7.0_07/include
Run Code Online (Sandbox Code Playgroud)
但这取决于你的makefile.
小智 22
它需要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
Run Code Online (Sandbox Code Playgroud)
这将包括广泛的JNI文件和Linux所需的文件
小智 14
安装OpenJDK开发工具包(JDK)应该可以解决您的问题.
sudo apt-get install openjdk-X-jdk
Run Code Online (Sandbox Code Playgroud)
这应该使你能够编译没有问题.
对我来说,确保包含 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.
Run Code Online (Sandbox Code Playgroud)
事实上,include我的$JAVA_HOME. 非常简单的补救措施:
sudo apt-get install openjdk-8-jre openjdk-8-jdk
Run Code Online (Sandbox Code Playgroud)
(请注意,这是专门用于安装openJDK而不是来自 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.
Run Code Online (Sandbox Code Playgroud)
使用以下代码:
make -I/usr/lib/jvm/jdk*/include
Run Code Online (Sandbox Code Playgroud)
其中jdk*是jdk安装的目录名(例如jdk1.7.0).
并且没有系统范围的解决方案,因为目录名称与下载和安装的不同JDK版本不同.如果您需要自动化解决方案,请在单个脚本中包含所有命令,并在终端中运行所述脚本.
我通常像这样定义我的 JAVA_HOME 变量:
export JAVA_HOME=/usr/lib/jvm/java/
Run Code Online (Sandbox Code Playgroud)
其中有必要的包含文件。当我编译很多需要它的东西时,我有时会将下面的内容添加到我的 .barshrc 中。
小智 5
将 JAVA_INCLUDE_DIR 设置为 jni.h 所在位置应该可以解决您的问题(设置 CPPFLAGS 对我不起作用)
假设是/usr/lib64/java/include;
export JAVA_INCLUDE_DIR=/usr/lib64/java/include
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
130885 次 |
| 最近记录: |