diff --git a/com.oracle.truffle.r.native/fficall/src/jni/rffiutils.c b/com.oracle.truffle.r.native/fficall/src/jni/rffiutils.c
index 07f347eec3e03d998d1ab86c0b40e0beb02ee6bb..bec561670d9b513b37132677b97155d087b11341 100644
--- a/com.oracle.truffle.r.native/fficall/src/jni/rffiutils.c
+++ b/com.oracle.truffle.r.native/fficall/src/jni/rffiutils.c
@@ -69,6 +69,7 @@ typedef struct nativeArrayTable_struct {
 static NativeArrayElem *nativeArrayTable;
 // hwm of nativeArrayTable
 static int nativeArrayTableHwm;
+static int nativeArrayTableLastIndex;
 static int nativeArrayTableLength;
 static void releaseNativeArray(JNIEnv *env, int index);
 
@@ -209,6 +210,16 @@ void updateNativeArrays(JNIEnv *env) {
 
 
 static void *findNativeArray(JNIEnv *env, SEXP x) {
+    if (nativeArrayTableLastIndex < nativeArrayTableHwm) {
+        NativeArrayElem cv = nativeArrayTable[nativeArrayTableLastIndex];
+        if (cv.obj != NULL && (cv.obj == x || (*env)->IsSameObject(env, cv.obj, x))) {
+            void *data = cv.data;
+#if TRACE_NATIVE_ARRAYS
+            fprintf(traceFile, "findNativeArray(%p): found %p (cached)\n", x, data);
+#endif
+            return data;
+        }
+    }
     int i;
     assert(isValidJNIRef(env, x));
     for (i = 0; i < nativeArrayTableHwm; i++) {
@@ -216,6 +227,7 @@ static void *findNativeArray(JNIEnv *env, SEXP x) {
         if (cv.obj != NULL) {
             assert(isValidJNIRef(env, cv.obj));
             if ((*env)->IsSameObject(env, cv.obj, x)) {
+                nativeArrayTableLastIndex = i;
                 void *data = cv.data;
 #if TRACE_NATIVE_ARRAYS
                 fprintf(traceFile, "findNativeArray(%p): found %p\n", x, data);