【问题标题】:jni.h file not foundjni.h 文件未找到
【发布时间】:2019-11-28 18:57:37
【问题描述】:

我最终尝试在运行 R 3.3.3 和 Java 12 和 Mojave OS 的 Mac 上安装 RJDBC 包。

尝试安装 RDJBC 时出现以下错误:

configure: error: One or more Java configuration variables are not set.
Make sure R is configured with full Java support (including JDK). Run
R CMD javareconf
as root to add Java support to R.

If you don't have root privileges, run
R CMD javareconf -e
to set all Java-related variables and then install rJava.

然后我继续在终端中运行 R CMD javareconf 并收到以下错误:

conftest.c:1:10: fatal error: 'jni.h' file not found

我在网上发现了围绕同一主题的各种问题,并尝试了建议的解决方案,但没有一个对我有用。它可能是我的 OS/Java 版本的组合。有人愿意在这里指导我解决问题吗?

更新:

堆栈跟踪

WARNING: Initial Java 12 release has broken JNI support and does NOT work. Use stable Java 11 (or watch for 12u if avaiable).
ERROR: Java exception occurred during rJava bootstrap - see stderr for Java stack trace.
Exception in thread "main" java.lang.NullPointerException
    at java.base/jdk.internal.reflect.Reflection.verifyMemberAccess(Reflection.java:130)
    at java.base/java.lang.reflect.AccessibleObject.slowVerifyAccess(AccessibleObject.java:673)
    at java.base/java.lang.reflect.AccessibleObject.verifyAccess(AccessibleObject.java:666)
    at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:638)
    at java.base/java.lang.reflect.Field.checkAccess(Field.java:1075)
    at java.base/java.lang.reflect.Field.get(Field.java:416)
Error in .jcheck(silent = FALSE) : 
  java.lang.NullPointerException.jcall(f, "Ljava/lang/Object;", "get", .jcast(ic, "java/lang/Object"))new("jobjRef", jobj = <pointer: 0x7fd4a04ac4b8>, jclass = "java/lang/NullPointerException")

有趣的是,当我通过终端运行 R 时,它似乎可以工作,但在 Rstudio 中却不行。

【问题讨论】:

    标签: r macos rjdbc


    【解决方案1】:

    这需要一些调整。一般来说,当 R、Java 和 rJava 应该一起工作时,它们的设置并不容易。请务必通过:http://www.owsiak.org/r-java-11-and-making-sure-you-can-load-rjava/

    请注意,由于 Java 12 的更改,不再可能通过反射动态影响共享库的位置 - 这会影响 rJava。我很确定你不会得到 rJava 和任何其他基于 JNI 的代码,它们在 R 中与 Java 12 一起正常工作。

    配置好 R 后,它将按预期工作

    > R
    
    R version 3.6.1 (2019-07-05) -- "Action of the Toes"
    Copyright (C) 2019 The R Foundation for Statistical Computing
    Platform: x86_64-apple-darwin15.6.0 (64-bit)
    
    ...
    ...
    
    > install.packages("RJDBC")
    --- Please select a CRAN mirror for use in this session ---
    ...
    
    > library(RJDBC)
    Loading required package: DBI
    >
    

    更新

    对于Java 12,请尝试关注。在~/.profile 内添加以下行

    export JAVA_HOME=$(/usr/libexec/java_home -v 12)
    

    然后,运行

    > 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
    

    还有,在R

    > system("java -version")
    java version "12.0.1" 2019-04-16
    Java(TM) SE Runtime Environment (build 12.0.1+12)
    Java HotSpot(TM) 64-Bit Server VM (build 12.0.1+12, mixed mode, sharing)
    > library(RJDBC)
    Loading required package: DBI
    Loading required package: rJava
    >
    
    

    当然,您仍然需要 XCode.app,因为它包含 JNI 的标头。

    更新

    为了确保所有应用都获得Java 11 而不是Java 12(不仅基于CLI),您可以按照以下方式“禁用”Java 12

    cd /Library/Java/JavaVirtualMachines/jdk-12.0.1.jdk/Contents
    sudo mv Info.plist Info.plist~
    

    从现在开始,即使您没有删除Java 12RStudio 也会选择正确的版本。

    【讨论】:

    • 所以我需要降级到 java 11?
    • 从 java 12 切换到 11 的最佳方法是什么。我安装了 11,但正在使用 12。
    • 这没有按预期工作,安装 RJDBC 确实成功了,但在尝试使用它时出现 Java 异常。
    • 你有什么建议?
    • 您必须发布异常和堆栈跟踪。没有它,就像在迷雾中行走。
    猜你喜欢
    • 1970-01-01
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多