R, Java 11 and making sure you can load rJava
As usual, there are some issues with new Java releases (11 and 12) and R. If you want to run rJava package inside R you have to do few things.
First, make sure you are using Java 11 as default inside terminal session. Inside ~/.profile add this line
export JAVA_HOME=$(/usr/libexec/java_home -v 11)
Once it’s done, you have to make sure to install XCode – you can find it here: XCode. We will need that. XCode contains SDK that is used while R reconfigures itself – it will try to compile small, JNI based, code.
After XCode is installed, make sure to modify this file: /Library/Frameworks/R.framework/Versions/3.4/Resources/etc/Makeconf.
Try to locate the line that reads
CPPFLAGS = -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk -I/usr/local/include
and replace it with line
CPPFLAGS = -isysroot /Applications/XCode/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/ -I/usr/local/include
Note! Make sure this is just one line inside Makeconf!
Now, you are ready to configure R. Simply call this one
> 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
That’s it. You can now install and use rJava package.
Let’s say you have this simple code
. `-- src `-- somepackage `-- StringTest.java
and the content of file is
package somepackage; public class StringTest { public String changeString(String str) { return "I have changed the string: " + str; } public static void main(String [] arg) { System.out.println(new StringTest().changeString("Hello")); } }
You can compile it following way.
> javac -d target src/somepackage/StringTest.java > java -cp target somepackage.StringTest I have changed the string: Hello > export CLASSPATH=`pwd`/target
and then, use it inside 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) ... ... ... > library(rJava) > .jinit() > obj <- .jnew("somepackage.StringTest") > s <- .jcall(obj, returnSig="Ljava/lang/String;", method="changeString", "Hello") > print(s) [1] "I have changed the string: Hello" > s <- .jcall(obj, returnSig="V", method="main", c("Hello", "Hello") ) I have changed the string: Hello