Add support for user-defined cache path.

Change-Id: I57d47a05465e6175543ad8202a21a8befac78de5
diff --git a/tests/tests/rscpp/librscpptest/rs_jni.cpp b/tests/tests/rscpp/librscpptest/rs_jni.cpp
index 16c4176..92ebd56 100644
--- a/tests/tests/rscpp/librscpptest/rs_jni.cpp
+++ b/tests/tests/rscpp/librscpptest/rs_jni.cpp
@@ -30,30 +30,35 @@
 using namespace android::RSC;
 
 extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSInitTest_initTest(JNIEnv * env,
-                                                                               jclass obj)
+                                                                                 jclass obj,
+                                                                                 jstring pathObj)
 {
+    const char * path = env->GetStringUTFChars(pathObj, NULL);
     bool r = true;
     for (int i = 0; i < 1000; i++) {
         sp<RS> rs = new RS();
-        r &= rs->init();
+        r &= rs->init(path);
         LOGE("Native iteration %i, returned %i", i, (int)r);
     }
+    env->ReleaseStringUTFChars(pathObj, path);
     return r;
 }
 
 extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSBlurTest_blurTest(JNIEnv * env,
                                                                                  jclass obj,
+                                                                                 jstring pathObj,
                                                                                  jint X,
                                                                                  jint Y,
                                                                                  jbyteArray inputByteArray,
                                                                                  jbyteArray outputByteArray,
                                                                                  jboolean singleChannel)
 {
+    const char * path = env->GetStringUTFChars(pathObj, NULL);
     jbyte * input = (jbyte *) env->GetPrimitiveArrayCritical(inputByteArray, 0);
     jbyte * output = (jbyte *) env->GetPrimitiveArrayCritical(outputByteArray, 0);
 
     sp<RS> rs = new RS();
-    rs->init();
+    rs->init(path);
 
     sp<const Element> e;
     if (singleChannel) {
@@ -75,24 +80,26 @@
 
     env->ReleasePrimitiveArrayCritical(inputByteArray, input, 0);
     env->ReleasePrimitiveArrayCritical(outputByteArray, output, 0);
+    env->ReleaseStringUTFChars(pathObj, path);
     return (rs->getError() == RS_SUCCESS);
 
 }
 
 extern "C" JNIEXPORT jboolean JNICALL
-Java_android_cts_rscpp_RSConvolveTest_convolveTest(JNIEnv * env, jclass obj, jint X,
-                                                   jint Y, jbyteArray inputByteArray,
+Java_android_cts_rscpp_RSConvolveTest_convolveTest(JNIEnv * env, jclass obj, jstring pathObj,
+                                                   jint X, jint Y, jbyteArray inputByteArray,
                                                    jbyteArray outputByteArray,
                                                    jfloatArray coeffArray,
                                                    jboolean is3x3)
 {
+    const char * path = env->GetStringUTFChars(pathObj, NULL);
     jfloat * coeffs = env->GetFloatArrayElements(coeffArray, NULL);
     jbyte * input = (jbyte *) env->GetPrimitiveArrayCritical(inputByteArray, 0);
     jbyte * output = (jbyte *) env->GetPrimitiveArrayCritical(outputByteArray, 0);
 
 
     sp<RS> rs = new RS();
-    rs->init();
+    rs->init(path);
 
     sp<const Element> e = Element::A_8(rs);
 
@@ -119,22 +126,25 @@
     env->ReleasePrimitiveArrayCritical(inputByteArray, input, 0);
     env->ReleasePrimitiveArrayCritical(outputByteArray, output, 0);
     env->ReleaseFloatArrayElements(coeffArray, coeffs, JNI_ABORT);
+    env->ReleaseStringUTFChars(pathObj, path);
     return (rs->getError() == RS_SUCCESS);
 
 }
 
 extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSLUTTest_lutTest(JNIEnv * env,
                                                                                jclass obj,
+                                                                               jstring pathObj,
                                                                                jint X,
                                                                                jint Y,
                                                                                jbyteArray inputByteArray,
                                                                                jbyteArray outputByteArray)
 {
+    const char * path = env->GetStringUTFChars(pathObj, NULL);
     jbyte * input = (jbyte *) env->GetPrimitiveArrayCritical(inputByteArray, 0);
     jbyte * output = (jbyte *) env->GetPrimitiveArrayCritical(outputByteArray, 0);
 
     sp<RS> rs = new RS();
-    rs->init();
+    rs->init(path);
 
     sp<const Element> e = Element::RGBA_8888(rs);
 
@@ -156,12 +166,14 @@
 
     env->ReleasePrimitiveArrayCritical(inputByteArray, input, 0);
     env->ReleasePrimitiveArrayCritical(outputByteArray, output, 0);
+    env->ReleaseStringUTFChars(pathObj, path);
     return (rs->getError() == RS_SUCCESS);
 
 }
 
 extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RS3DLUTTest_lutTest(JNIEnv * env,
                                                                                  jclass obj,
+                                                                                 jstring pathObj,
                                                                                  jint X,
                                                                                  jint Y,
                                                                                  jint lutSize,
@@ -169,12 +181,13 @@
                                                                                  jbyteArray inputByteArray2,
                                                                                  jbyteArray outputByteArray)
 {
+    const char * path = env->GetStringUTFChars(pathObj, NULL);
     jbyte * input = (jbyte *) env->GetPrimitiveArrayCritical(inputByteArray, 0);
     jbyte * input2 = (jbyte *) env->GetPrimitiveArrayCritical(inputByteArray2, 0);
     jbyte * output = (jbyte *) env->GetPrimitiveArrayCritical(outputByteArray, 0);
 
     sp<RS> rs = new RS();
-    rs->init();
+    rs->init(path);
 
     sp<const Element> e = Element::RGBA_8888(rs);
 
@@ -200,23 +213,25 @@
     env->ReleasePrimitiveArrayCritical(inputByteArray, input, 0);
     env->ReleasePrimitiveArrayCritical(inputByteArray2, input2, 0);
     env->ReleasePrimitiveArrayCritical(outputByteArray, output, 0);
+    env->ReleaseStringUTFChars(pathObj, path);
     return (rs->getError() == RS_SUCCESS);
 
 }
 
 extern "C" JNIEXPORT jboolean JNICALL
-Java_android_cts_rscpp_RSColorMatrixTest_colorMatrixTest(JNIEnv * env, jclass obj, jint X,
-                                                         jint Y, jbyteArray inputByteArray,
+Java_android_cts_rscpp_RSColorMatrixTest_colorMatrixTest(JNIEnv * env, jclass obj, jstring pathObj,
+                                                         jint X, jint Y, jbyteArray inputByteArray,
                                                          jbyteArray outputByteArray,
                                                          jfloatArray coeffArray,
                                                          jint optionFlag)
 {
+    const char * path = env->GetStringUTFChars(pathObj, NULL);
     jfloat * coeffs = env->GetFloatArrayElements(coeffArray, NULL);
     jbyte * input = (jbyte *) env->GetPrimitiveArrayCritical(inputByteArray, 0);
     jbyte * output = (jbyte *) env->GetPrimitiveArrayCritical(outputByteArray, 0);
 
     sp<RS> rs = new RS();
-    rs->init();
+    rs->init(path);
 
     sp<const Element> e = Element::RGBA_8888(rs);
 
@@ -248,21 +263,23 @@
     env->ReleasePrimitiveArrayCritical(inputByteArray, input, 0);
     env->ReleasePrimitiveArrayCritical(outputByteArray, output, 0);
     env->ReleaseFloatArrayElements(coeffArray, coeffs, JNI_ABORT);
+    env->ReleaseStringUTFChars(pathObj, path);
     return (rs->getError() == RS_SUCCESS);
 
 }
 
 extern "C" JNIEXPORT jboolean JNICALL
-Java_android_cts_rscpp_RSBlendTest_blendTest(JNIEnv * env, jclass obj, jint X,
-                                             jint Y, jbyteArray inputByteArray,
+Java_android_cts_rscpp_RSBlendTest_blendTest(JNIEnv * env, jclass obj, jstring pathObj,
+                                             jint X, jint Y, jbyteArray inputByteArray,
                                              jbyteArray outputByteArray,
                                              jint optionFlag)
 {
+    const char * path = env->GetStringUTFChars(pathObj, NULL);
     jbyte * input = (jbyte *) env->GetPrimitiveArrayCritical(inputByteArray, 0);
     jbyte * output = (jbyte *) env->GetPrimitiveArrayCritical(outputByteArray, 0);
 
     sp<RS> rs = new RS();
-    rs->init();
+    rs->init(path);
 
     sp<const Element> e = Element::RGBA_8888(rs);
 
@@ -327,6 +344,7 @@
 
     env->ReleasePrimitiveArrayCritical(inputByteArray, input, 0);
     env->ReleasePrimitiveArrayCritical(outputByteArray, output, 0);
+    env->ReleaseStringUTFChars(pathObj, path);
     return (rs->getError() == RS_SUCCESS);
 
 }
diff --git a/tests/tests/rscpp/librscpptest/rs_jni_allocation.cpp b/tests/tests/rscpp/librscpptest/rs_jni_allocation.cpp
index 6a429ec..4157026 100644
--- a/tests/tests/rscpp/librscpptest/rs_jni_allocation.cpp
+++ b/tests/tests/rscpp/librscpptest/rs_jni_allocation.cpp
@@ -54,10 +54,13 @@
 }
 
 extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSAllocationTest_typedTest(JNIEnv * env,
-                                                                               jclass obj)
+                                                                                        jclass obj,
+                                                                                        jstring pathObj)
 {
+    const char * path = env->GetStringUTFChars(pathObj, NULL);
     sp<RS> mRS = new RS();
-    mRS->init();
+    mRS->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
 
     createTypedHelper(mRS, Element::A_8(mRS));
     createTypedHelper(mRS, Element::RGBA_4444(mRS));
@@ -116,7 +119,6 @@
     createTypedHelper(mRS, Element::ALLOCATION(mRS));
 
     mRS->finish();
-
     return true;
 }
 
@@ -310,11 +312,13 @@
 static int elemsToTest = 20;
 
 extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSAllocationTest_test1DCopy(JNIEnv * env,
-                                                                               jclass obj)
+                                                                                         jclass obj,
+                                                                                         jstring pathObj)
 {
+    const char * path = env->GetStringUTFChars(pathObj, NULL);
     sp<RS> mRS = new RS();
-    mRS->init();
-
+    mRS->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
     bool passed = true;
 
     for (int s = 8; s <= elemsToTest; s += 2) {
@@ -346,15 +350,17 @@
             }
         }
     }
-
     return passed;
 }
 
 extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSAllocationTest_testSetElementAt(JNIEnv * env,
-                                                                                               jclass obj)
+                                                                                               jclass obj,
+                                                                                               jstring pathObj)
 {
+    const char * path = env->GetStringUTFChars(pathObj, NULL);
     sp<RS> mRS = new RS();
-    mRS->init();
+    mRS->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
 
     bool passed = true;
 
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RS3DLUTTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RS3DLUTTest.java
index 197a4cd..7a85f57 100644
--- a/tests/tests/rscpp/src/android/cts/rscpp/RS3DLUTTest.java
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RS3DLUTTest.java
@@ -35,7 +35,7 @@
 
     private final int lutSize = 64;
 
-    native boolean lutTest(int X, int Y, int lutSize, byte[] input, byte[] input2, byte[] output);
+    native boolean lutTest(String path, int X, int Y, int lutSize, byte[] input, byte[] input2, byte[] output);
     public void testRSLUT() {
         int[] baseAlloc = new int[X * Y * 4];
         RSUtils.genRandom(0x419144, 255, 1, -128, baseAlloc);
@@ -71,7 +71,7 @@
         lut.forEach(rsInput, rsOutput);
 
         byte[] nativeByteAlloc = new byte[X * Y * 4];
-        lutTest(X, Y, lutSize, byteAlloc, byteColorCube, nativeByteAlloc);
+        lutTest(this.getContext().getCacheDir().toString(), X, Y, lutSize, byteAlloc, byteColorCube, nativeByteAlloc);
         rsOutput.copyTo(byteAlloc);
 
         for (int i = 0; i < X * Y * 4; i++) {
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSAllocationTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSAllocationTest.java
index 0e06a99..86662bf 100644
--- a/tests/tests/rscpp/src/android/cts/rscpp/RSAllocationTest.java
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSAllocationTest.java
@@ -29,19 +29,19 @@
         System.loadLibrary("rscpptest_jni");
     }
 
-    native boolean typedTest();
+    native boolean typedTest(String path);
     public void testRSAllocationTypes() {
-        assertTrue(typedTest());
+        assertTrue(typedTest(this.getContext().getCacheDir().toString()));
     }
 
-    native boolean test1DCopy();
+    native boolean test1DCopy(String path);
     public void testRSAllocationCopy() {
-        assertTrue(test1DCopy());
+        assertTrue(test1DCopy(this.getContext().getCacheDir().toString()));
     }
 
-    native boolean testSetElementAt();
+    native boolean testSetElementAt(String path);
     public void testRSAllocationSetElementAt() {
-        assertTrue(testSetElementAt());
+        assertTrue(testSetElementAt(this.getContext().getCacheDir().toString()));
     }
 
 
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSBlendTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSBlendTest.java
index b378807..0830f78 100644
--- a/tests/tests/rscpp/src/android/cts/rscpp/RSBlendTest.java
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSBlendTest.java
@@ -33,7 +33,7 @@
     private static final int X = 256;
     private static final int Y = 256;
 
-    native boolean blendTest(int X, int Y, byte[] input, byte[] output, int optionFlag);
+    native boolean blendTest(String path, int X, int Y, byte[] input, byte[] output, int optionFlag);
     public void testRSBlend() {
         for (int iter = 0; iter < 15; iter++) {
             int[] baseAlloc = new int[X * Y * 4];
@@ -111,7 +111,7 @@
                 break;
             }
 
-            blendTest(X, Y, byteAlloc, byteAlloc2, iter);
+            blendTest(this.getContext().getCacheDir().toString(), X, Y, byteAlloc, byteAlloc2, iter);
             rsOutput.copyTo(byteAlloc);
             for (int i = 0; i < X * Y * 4; i++) {
                 assertTrue(byteAlloc[i] == byteAlloc2[i]);
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSBlurTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSBlurTest.java
index 4d4530c..e546516 100644
--- a/tests/tests/rscpp/src/android/cts/rscpp/RSBlurTest.java
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSBlurTest.java
@@ -33,7 +33,7 @@
     private final int X = 1024;
     private final int Y = 1024;
 
-    native boolean blurTest(int X, int Y, byte[] input, byte[] output, boolean singleChannel);
+    native boolean blurTest(String path, int X, int Y, byte[] input, byte[] output, boolean singleChannel);
     public void testRSBlurOneChannel() {
         int[] baseAlloc = new int[X * Y];
         RSUtils.genRandom(0x1DEFF, 255, 1, -128, baseAlloc);
@@ -55,7 +55,7 @@
         blur.forEach(rsOutput);
 
         byte[] nativeByteAlloc = new byte[X * Y];
-        blurTest(X, Y, byteAlloc, nativeByteAlloc, true);
+        blurTest(this.getContext().getCacheDir().toString(), X, Y, byteAlloc, nativeByteAlloc, true);
         rsOutput.copyTo(byteAlloc);
 
         for (int i = 0; i < X * Y; i++) {
@@ -86,7 +86,7 @@
         blur.forEach(rsOutput);
 
         byte[] nativeByteAlloc = new byte[X * Y * 4];
-        blurTest(X, Y, byteAlloc, nativeByteAlloc, false);
+        blurTest(this.getContext().getCacheDir().toString(), X, Y, byteAlloc, nativeByteAlloc, false);
         rsOutput.copyTo(byteAlloc);
 
         for (int i = 0; i < X * Y * 4; i++) {
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSColorMatrixTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSColorMatrixTest.java
index e4c0085..d634c1f 100644
--- a/tests/tests/rscpp/src/android/cts/rscpp/RSColorMatrixTest.java
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSColorMatrixTest.java
@@ -33,7 +33,7 @@
     private final int X = 1024;
     private final int Y = 1024;
 
-    native boolean colorMatrixTest(int X, int Y, byte[] input, byte[] output, float[] coeffs, int optionFlag);
+    native boolean colorMatrixTest(String path, int X, int Y, byte[] input, byte[] output, float[] coeffs, int optionFlag);
     public void testRSColorMatrix0() {
         int[] baseAlloc = new int[X * Y * 4];
         RSUtils.genRandom(0x251107, 255, 1, -128, baseAlloc);
@@ -67,7 +67,7 @@
         cm.forEach(rsInput, rsOutput);
 
         byte[] nativeByteAlloc = new byte[X * Y * 4];
-        colorMatrixTest(X, Y, byteAlloc, nativeByteAlloc, coeffs, 0);
+        colorMatrixTest(this.getContext().getCacheDir().toString(), X, Y, byteAlloc, nativeByteAlloc, coeffs, 0);
         rsOutput.copyTo(byteAlloc);
 
         for (int i = 0; i < X * Y * 4; i++) {
@@ -99,7 +99,7 @@
         cm.forEach(rsInput, rsOutput);
 
         byte[] nativeByteAlloc = new byte[X * Y * 4];
-        colorMatrixTest(X, Y, byteAlloc, nativeByteAlloc, coeffs, 1);
+        colorMatrixTest(this.getContext().getCacheDir().toString(), X, Y, byteAlloc, nativeByteAlloc, coeffs, 1);
         rsOutput.copyTo(byteAlloc);
 
         for (int i = 0; i < X * Y * 4; i++) {
@@ -135,7 +135,7 @@
         cm.forEach(rsInput, rsOutput);
 
         byte[] nativeByteAlloc = new byte[X * Y * 4];
-        colorMatrixTest(X, Y, byteAlloc, nativeByteAlloc, coeffs, 2);
+        colorMatrixTest(this.getContext().getCacheDir().toString(), X, Y, byteAlloc, nativeByteAlloc, coeffs, 2);
         rsOutput.copyTo(byteAlloc);
 
         for (int i = 0; i < X * Y * 4; i++) {
@@ -167,7 +167,7 @@
         cm.forEach(rsInput, rsOutput);
 
         byte[] nativeByteAlloc = new byte[X * Y * 4];
-        colorMatrixTest(X, Y, byteAlloc, nativeByteAlloc, coeffs, 3);
+        colorMatrixTest(this.getContext().getCacheDir().toString(), X, Y, byteAlloc, nativeByteAlloc, coeffs, 3);
         rsOutput.copyTo(byteAlloc);
 
         for (int i = 0; i < X * Y * 4; i++) {
@@ -199,7 +199,7 @@
         cm.forEach(rsInput, rsOutput);
 
         byte[] nativeByteAlloc = new byte[X * Y * 4];
-        colorMatrixTest(X, Y, byteAlloc, nativeByteAlloc, coeffs, 4);
+        colorMatrixTest(this.getContext().getCacheDir().toString(), X, Y, byteAlloc, nativeByteAlloc, coeffs, 4);
         rsOutput.copyTo(byteAlloc);
 
         for (int i = 0; i < X * Y * 4; i++) {
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSConvolveTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSConvolveTest.java
index d669d3b..ded67cc 100644
--- a/tests/tests/rscpp/src/android/cts/rscpp/RSConvolveTest.java
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSConvolveTest.java
@@ -33,7 +33,7 @@
     private final int X = 1024;
     private final int Y = 1024;
 
-    native boolean convolveTest(int X, int Y, byte[] input, byte[] output, float[] coeffs, boolean is3x3);
+    native boolean convolveTest(String path, int X, int Y, byte[] input, byte[] output, float[] coeffs, boolean is3x3);
     public void testConvolve3x3() {
         int[] baseAlloc = new int[X * Y];
         float[] coeffs = new float[9];
@@ -66,7 +66,7 @@
         convolve.forEach(rsOutput);
 
         byte[] nativeByteAlloc = new byte[X * Y];
-        convolveTest(X, Y, byteAlloc, nativeByteAlloc, coeffs, true);
+        convolveTest(this.getContext().getCacheDir().toString(), X, Y, byteAlloc, nativeByteAlloc, coeffs, true);
         rsOutput.copyTo(byteAlloc);
 
         for (int i = 0; i < X * Y; i++) {
@@ -124,7 +124,7 @@
         convolve.forEach(rsOutput);
 
         byte[] nativeByteAlloc = new byte[X * Y];
-        convolveTest(X, Y, byteAlloc, nativeByteAlloc, coeffs, false);
+        convolveTest(this.getContext().getCacheDir().toString(), X, Y, byteAlloc, nativeByteAlloc, coeffs, false);
         rsOutput.copyTo(byteAlloc);
 
         for (int i = 0; i < X * Y; i++) {
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSInitTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSInitTest.java
index 22804d3..7fd5ffa 100644
--- a/tests/tests/rscpp/src/android/cts/rscpp/RSInitTest.java
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSInitTest.java
@@ -29,13 +29,13 @@
         System.loadLibrary("rscpptest_jni");
     }
 
-    native boolean initTest();
+    native boolean initTest(String path);
     public void testRSInit() {
         for (int i = 0; i < 1000; i++) {
             RenderScript mRS = RenderScript.create(getContext());
             mRS.destroy();
             Log.d("rscpptest", "Java iteration " + i);
         }
-        assertTrue(initTest());
+        assertTrue(initTest(this.getContext().getCacheDir().toString()));
     }
 }
\ No newline at end of file
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSLUTTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSLUTTest.java
index 7890d57..2579666 100644
--- a/tests/tests/rscpp/src/android/cts/rscpp/RSLUTTest.java
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSLUTTest.java
@@ -33,7 +33,7 @@
     private final int X = 1024;
     private final int Y = 1024;
 
-    native boolean lutTest(int X, int Y, byte[] input, byte[] output);
+    native boolean lutTest(String path, int X, int Y, byte[] input, byte[] output);
     public void testRSLUT() {
         int[] baseAlloc = new int[X * Y * 4];
         RSUtils.genRandom(0x72727272, 255, 1, -128, baseAlloc);
@@ -59,7 +59,7 @@
         lut.forEach(rsInput, rsOutput);
 
         byte[] nativeByteAlloc = new byte[X * Y * 4];
-        lutTest(X, Y, byteAlloc, nativeByteAlloc);
+        lutTest(this.getContext().getCacheDir().toString().toString(), X, Y, byteAlloc, nativeByteAlloc);
         rsOutput.copyTo(byteAlloc);
 
         for (int i = 0; i < X * Y * 4; i++) {