安装rJava:即使是相同的Java路径获得:错误:一个或多个JNI类型从对应的原生型

问题描述:

我在Linux服务器上RHEL6工作不同,我安装了蟒蛇。我有以下设置安装rJava:即使是相同的Java路径获得:错误:一个或多个JNI类型从对应的原生型

conda-env version : 4.3.13 
conda-build version : 2.1.4 
python version : 2.7.13.final.0 
rpy2 : 2.8.5 

我安装了rpy2在Python中使用R.但与畅达安装R的版本我有问题安装“rJava”。

checking whether Java run-time works... yes 
checking whether -Xrs is supported... yes 
checking whether JNI programs can be compiled... yes 
checking JNI data types... configure: error: One or more JNI types differ from the corresponding native type. You may need to use non-standard compiler flags or a different compiler in order to fix this. 
ERROR: configuration failed for package 'rJava' 

随着我在同一台机器上安装独立版本的R,我没有问题,所以我知道我安装了正确的版本。

对于我的2个不同的设置与相同的R-版本(与康达[R独立的R),我也有同样的Java版本

java -version 
openjdk version "1.8.0_121" 
OpenJDK Runtime Environment (build 1.8.0_121-b13) 
OpenJDK 64-Bit Server VM (build 25.121-b13, mixed mode) 

对于这两种设置,以下变量不退出

R_JAVA_LD_LIBRARY_PATH 
JAVA_HOME 

定义。道路是为独立非常相似:

PATH=/opt/ccda/anaconda2/bin:/opt/opennlp/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin 

而对R安装了畅达我:

PATH=/opt/ccda/anaconda2/envs/py27CCA/bin:/opt/ccda/anaconda2/bin:/opt/ccda/anaconda2/bin:/opt/opennlp/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin 

这里编译过程中的信息。对于独立[R版本:

interpreter : '/usr/bin/java' 
archiver : '/usr/bin/jar' 
compiler : '/usr/bin/javac' 
header prep.: '/usr/bin/javah' 
cpp flags : '-I/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el6_8.x86_64/jre/../include -I/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el6_8.x86_64/jre/../include/linux' 
java libs : '-L/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el6_8.x86_64/jre/lib/amd64/server -ljvm 

虽然与畅达安装将R版本:

interpreter : '/usr/lib/jvm/java/jre/bin/java' 
archiver : '/usr/lib/jvm/java/jre/../bin/jar' 
compiler : '/usr/lib/jvm/java/jre/../bin/javac' 
header prep.: '/usr/lib/jvm/java/jre/../bin/javah' 
cpp flags : '-I/usr/lib/jvm/java/include -I/usr/lib/jvm/java/include/linux' 
java libs : '-L/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el6_8.x86_64/jre/lib/amd64/server -ljvm' 

我试着使用,以获得相同的路径:

export JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk.x86_64/bin/java 
export R_JAVA_LD_LIBRARY_PATH=${JAVA_HOME}/lib/amd64/server 
export JAVA_CPPFLAGS="-I/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el6_8.x86_64/jre/../include -I/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el6_8.x86_64/jre/../include/linux" 

的方式:

/usr/bin/java -> /etc/alternatives/java 
/etc/alternatives/java -> /usr/lib/jvm/jre-1.8.0-openjdk.x86_64/bin/java 

但reru后nning:

R CMD javareconf 

和重新编译,我得到了同样的错误,而路径现在似乎是相同的:

interpreter : '/usr/bin/java' 
archiver : '/usr/bin/jar' 
compiler : '/usr/bin/javac' 
header prep.: '/usr/bin/javah' 
cpp flags : '-I/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el6_8.x86_64/jre/../include -I/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el6_8.x86_64/jre/../include/linux' 
java libs : '-L/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el6_8.x86_64/jre/lib/amd64/server -ljvm' 

所以我不明白这是什么意思“一个或多个JNI类型不同”,什么我应该在路径和旗帜上让它工作。

R CMD javareconf 
Java interpreter : /usr/lib/jvm/jre-1.8.0-openjdk.x86_64/bin/java 
Java version  : 1.8.0_121 
Java home path : /usr/lib/jvm/jre-1.8.0-openjdk.x86_64 
Java compiler : /usr/lib/jvm/jre-1.8.0-openjdk.x86_64/../bin/javac 
Java headers gen.: /usr/lib/jvm/jre-1.8.0-openjdk.x86_64/../bin/javah 
Java archive tool: /usr/lib/jvm/jre-1.8.0-openjdk.x86_64/../bin/jar 

trying to compile and link a JNI program 
detected JNI cpp flags : -I/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el6_8.x86_64/jre/../include -I/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el6_8.x86_64/jre/../include/linux 
detected JNI linker flags : -L/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el6_8.x86_64/jre/lib/amd64/server -ljvm 
gcc -std=gnu99 -I/opt/ccda/anaconda2/envs/py27CCA/lib/R/include -DNDEBUG -I/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el6_8.x86_64/jre/../include -I/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el6_8.x86_64/jre/../include/linux -I/opt/ccda/anaconda2/envs/py27CCA/include -fpic -I/opt/ccda/anaconda2/envs/py27CCA/include -c conftest.c -o conftest.o 
gcc -std=gnu99 -shared -L/opt/ccda/anaconda2/envs/py27CCA/lib/R/lib -L/opt/ccda/anaconda2/envs/py27CCA/lib -lgfortran -o conftest.so conftest.o -L/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el6_8.x86_64/jre/lib/amd64/server -ljvm -L/opt/ccda/anaconda2/envs/py27CCA/lib/R/lib -lR 


JAVA_HOME  : /usr/lib/jvm/jre-1.8.0-openjdk.x86_64 
Java library path: /usr/lib/jvm/java/jre/lib/amd64/server 
JNI cpp flags : -I/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el6_8.x86_64/jre/../include -I/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el6_8.x86_64/jre/../include/linux 
JNI linker flags : -L/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el6_8.x86_64/jre/lib/amd64/server -ljvm 
Updating Java configuration in /opt/ccda/anaconda2/envs/py27CCA/lib/R 
Done. 

由于我不太了解错误信息的含义,所以我没有想法。我尝试了所有的有关类似问题的各个线程的建议。

编辑:使用出口

LD_LIBRARY_PATH=$JAVA_HOME/lib/amd64:$JAVA_HOME/lib/amd64/server 

解决问题的一部分(在不需要JAVA_HOME了这样的情况下),但我有太多其他的问题:

  • -m64标志不(在与独立R版本一起使用时)

  • /usr/bin/ld:找不到-liconv

但库中存在:

/opt/ccda/anaconda2/envs/py27CCA/lib/libiconv.so 
/opt/ccda/anaconda2/envs/py27CCA/lib/libiconv.so.2 
/opt/ccda/anaconda2/envs/py27CCA/lib/libiconv.so.2.5.1 
/opt/ccda/anaconda2/envs/py27CCA/lib/preloadable_libiconv.so 

但可能不会使用,因此我现在需要解决这个问题的路径。

确保使用指向JDK的显式设置重新配置R环境。

确保JAVA_HOME指向JDK

export JAVA_HOME=your_JDK_installation 

然后,重新配置R和通过所有位置明确

sudo R CMD javareconf \ 
JAVA_HOME=${JAVA_HOME} \ 
JAVA=${JAVA_HOME/bin/java \ 
JAVAC=${JAVA_HOME}/bin/javac \ 
JAVAH=${JAVA_HOME}/bin/javah \ 
JAR=${JAVA_HOME}/bin/jar \ 
JAVA_LD_LIBRARY_PATH=${JAVA_HOME}/jre/lib/server \ 
JAVA_CPPFLAGS="-I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux" 

然后,尝试配置rJava外[R

curl https://cran.r-project.org/src/contrib/rJava_0.9-8.tar.gz -o rJava_0.9-8.tar.gz 
tar zxf rJava_0.9-8.tar.gz 
cd rJava 
./configure 

如果它工作正常,你应该可以从R

install.packages("rJava", type="source")