jcall {rJava} | R Documentation |
.jcall
calls a Java method with the supplied arguments.
.jcall(obj, returnSig = "V", method, ..., evalArray = TRUE,
evalString = TRUE, check = TRUE, interface = "RcallMethod",
simplify = FALSE, use.true.class = FALSE)
obj |
Java object ( |
returnSig |
Return signature in JNI notation (e.g. "V" for void,
"[I" for |
method |
The name of the method to be called |
... |
Any parameters that will be passed to the Java method. The parameter
types are determined automatically and/or taken from the
|
evalArray |
This flag determines whether the array return value
is evaluated ( |
simplify |
If |
evalString |
This flag determines whether string result is returned as characters or as Java object reference. |
check |
If set to |
interface |
This option is experimental and specifies the interface used for calling the Java method; the current implementation supports two interfaces:
|
use.true.class |
logical. If set to |
.jcall
requires exact match of argument and return types. For
higher efficiency .jcall
doesn't perform any lookup in the
reflection tables. This means that passing subclasses of the classes
present in the method definition requires explicit casting using
.jcast
. Passing null
arguments also needs a
proper class specification with .jnull
.
Java types long
and float
have no corresponding types in
R and therefore any such parameters must be flagged as such using
.jfloat
and .jlong
functions respectively.
Java also distinguishes scalar and array types whereas R doesn't have
the concept of a scalar. In R a scalar is basically a vector (called
array in Java-speak) of the length 1. Therefore passing vectors of the
length 1 is ambiguous. .jcall
assumes that any vector of the
length 1 that corresponds to a native Java type is a scalar. All other
vectors are passed as arrays. Therefore it is important to use
.jarray
if an arbitrary vector (including those of the
length 1) is to be passed as an array parameter.
Important note about encoding of character vectors: Java interface always works with strings in UTF-8 encoding, therefore the safest way is to run R in a UTF-8 locale. If that is not possible for some reason, rJava can be used in non-UTF-8 locales, but care must be taken. Since R 2.7.0 it is possible to associate encoding with strings and rJava will flag all strings it produces with the appropriate UTF-8 tag. R will then perform corresponding appropriate conversions where possible (at a cost of speed and memory usage), but 3rd party code may not (e.g. older packages). Also rJava relies on correct encoding flags for strings passed to it and will attempt to perform conversions where necessary. If some 3rd party code produces strings incorrectly flagged, all bets are off.
Finally, for performance reasons class, method and field names as well as signatures are not always converted and should not contain non-ASCII characters.
Returns the result of the method.
.jnew
, .jcast
, .jnull
,
.jarray
.jcall("java/lang/System","S","getProperty","os.name")
if (!nzchar(Sys.getenv("NOAWT"))) {
f <- .jnew("java/awt/Frame","Hello")
.jcall(f,,"setVisible",TRUE)
}