Implement named slots and convert script.addType to script.setType to remove ordering restrictions.
diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java
index 31bfc57..b98a48ab 100644
--- a/graphics/java/android/renderscript/RenderScript.java
+++ b/graphics/java/android/renderscript/RenderScript.java
@@ -142,10 +142,10 @@
     native void nScriptSetClearDepth(int script, float depth);
     native void nScriptSetClearStencil(int script, int stencil);
     native void nScriptSetTimeZone(int script, byte[] timeZone);
+    native void nScriptSetType(int type, String name, int slot);
+    native void nScriptSetRoot(boolean isRoot);
 
     native void nScriptCBegin();
-    native void nScriptCAddType(int type);
-    native void nScriptCSetRoot(boolean isRoot);
     native void nScriptCSetScript(byte[] script, int offset, int length);
     native int  nScriptCCreate();
     native void nScriptCAddDefineI32(String name, int value);
diff --git a/graphics/java/android/renderscript/Script.java b/graphics/java/android/renderscript/Script.java
index 42c58ce..47479d8 100644
--- a/graphics/java/android/renderscript/Script.java
+++ b/graphics/java/android/renderscript/Script.java
@@ -20,6 +20,8 @@
  * @hide
  **/
 public class Script extends BaseObj {
+    public static final int MAX_SLOT = 16;
+
     boolean mIsRoot;
     Type[] mTypes;
 
@@ -64,39 +66,36 @@
         RenderScript mRS;
         boolean mIsRoot = false;
         Type[] mTypes;
-        int mTypeCount;
+        String[] mNames;
 
         Builder(RenderScript rs) {
             mRS = rs;
-            mTypes = new Type[4];
-            mTypeCount = 0;
+            mTypes = new Type[MAX_SLOT];
+            mNames = new String[MAX_SLOT];
         }
 
-        public void addType(Type t) {
-            if(mTypeCount >= mTypes.length) {
-                Type[] nt = new Type[mTypeCount * 2];
-                for(int ct=0; ct < mTypeCount; ct++) {
-                    nt[ct] = mTypes[ct];
-                }
-                mTypes = nt;
-            }
-            mTypes[mTypeCount] = t;
-            mTypeCount++;
+        public void setType(Type t, int slot) {
+            mTypes[slot] = t;
+            mNames[slot] = null;
+        }
+
+        public void setType(Type t, String name, int slot) {
+            mTypes[slot] = t;
+            mNames[slot] = name;
         }
 
         void transferCreate() {
-            mRS.nScriptCSetRoot(mIsRoot);
-            for(int ct=0; ct < mTypeCount; ct++) {
-                mRS.nScriptCAddType(mTypes[ct].mID);
+            mRS.nScriptSetRoot(mIsRoot);
+            for(int ct=0; ct < mTypes.length; ct++) {
+                if(mTypes[ct] != null) {
+                    mRS.nScriptSetType(mTypes[ct].mID, mNames[ct], ct);
+                }
             }
         }
 
         void transferObject(Script s) {
             s.mIsRoot = mIsRoot;
-            s.mTypes = new Type[mTypeCount];
-            for(int ct=0; ct < mTypeCount; ct++) {
-                s.mTypes[ct] = mTypes[ct];
-            }
+            s.mTypes = mTypes;
         }
 
         public void setRoot(boolean r) {
diff --git a/graphics/java/android/renderscript/Type.java b/graphics/java/android/renderscript/Type.java
index d35d482..afb0e60 100644
--- a/graphics/java/android/renderscript/Type.java
+++ b/graphics/java/android/renderscript/Type.java
@@ -56,7 +56,7 @@
         mRS.nTypeDestroy(mID);
     }
 
-    public static Type createFromClass(RenderScript rs, Class c, int size, String scriptName) {
+    public static Type createFromClass(RenderScript rs, Class c, int size) {
         Element e = Element.createFromClass(rs, c);
         Builder b = new Builder(rs, e);
         b.add(Dimension.X, size);
@@ -91,10 +91,16 @@
             rs.nTypeSetupFields(t, arTypes, arBits, fields);
         }
         t.mJavaClass = c;
+        return t;
+    }
+
+    public static Type createFromClass(RenderScript rs, Class c, int size, String scriptName) {
+        Type t = createFromClass(rs, c, size);
         t.setName(scriptName);
         return t;
     }
 
+
     public static class Builder {
         RenderScript mRS;
         Entry[] mEntries;
diff --git a/graphics/jni/android_renderscript_RenderScript.cpp b/graphics/jni/android_renderscript_RenderScript.cpp
index ef0cf68..5780e02 100644
--- a/graphics/jni/android_renderscript_RenderScript.cpp
+++ b/graphics/jni/android_renderscript_RenderScript.cpp
@@ -824,6 +824,29 @@
     }
 }
 
+static void
+nScriptSetType(JNIEnv *_env, jobject _this, jint type, jstring _str, jint slot)
+{
+    RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
+    LOG_API("nScriptCAddType, con(%p), type(%p), slot(%i)", con, (RsType)type, slot);
+    const char* n = NULL;
+    if (_str) {
+        n = _env->GetStringUTFChars(_str, NULL);
+    }
+    rsScriptSetType((RsType)type, slot, n);
+    if (n) {
+        _env->ReleaseStringUTFChars(_str, n);
+    }
+}
+
+static void
+nScriptSetRoot(JNIEnv *_env, jobject _this, jboolean isRoot)
+{
+    RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
+    LOG_API("nScriptCSetRoot, con(%p), isRoot(%i)", con, isRoot);
+    rsScriptSetRoot(isRoot);
+}
+
 // -----------------------------------
 
 static void
@@ -835,22 +858,6 @@
 }
 
 static void
-nScriptCAddType(JNIEnv *_env, jobject _this, jint type)
-{
-    RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
-    LOG_API("nScriptCAddType, con(%p), type(%p)", con, (RsType)type);
-    rsScriptCAddType((RsType)type);
-}
-
-static void
-nScriptCSetRoot(JNIEnv *_env, jobject _this, jboolean isRoot)
-{
-    RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
-    LOG_API("nScriptCSetRoot, con(%p), isRoot(%i)", con, isRoot);
-    rsScriptCSetRoot(isRoot);
-}
-
-static void
 nScriptCSetScript(JNIEnv *_env, jobject _this, jbyteArray scriptRef,
                   jint offset, jint length)
 {
@@ -1374,10 +1381,10 @@
 {"nScriptSetClearDepth",           "(IF)V",                                (void*)nScriptSetClearDepth },
 {"nScriptSetClearStencil",         "(II)V",                                (void*)nScriptSetClearStencil },
 {"nScriptSetTimeZone",             "(I[B)V",                               (void*)nScriptSetTimeZone },
+{"nScriptSetType",                 "(ILjava/lang/String;I)V",              (void*)nScriptSetType },
+{"nScriptSetRoot",                 "(Z)V",                                 (void*)nScriptSetRoot },
 
 {"nScriptCBegin",                  "()V",                                  (void*)nScriptCBegin },
-{"nScriptCAddType",                "(I)V",                                 (void*)nScriptCAddType },
-{"nScriptCSetRoot",                "(Z)V",                                 (void*)nScriptCSetRoot },
 {"nScriptCSetScript",              "([BII)V",                              (void*)nScriptCSetScript },
 {"nScriptCCreate",                 "()I",                                  (void*)nScriptCCreate },
 {"nScriptCAddDefineI32",           "(Ljava/lang/String;I)V",               (void*)nScriptCAddDefineI32 },