diff --git a/src/jni_internal.cc b/src/jni_internal.cc
index 5cc9ff6..81e2fdd 100644
--- a/src/jni_internal.cc
+++ b/src/jni_internal.cc
@@ -56,6 +56,12 @@
   DISALLOW_COPY_AND_ASSIGN(ScopedJniThreadState);
 };
 
+template<typename T>
+T AddLocalReference(ScopedJniThreadState& ts, Object* obj) {
+  UNIMPLEMENTED(WARNING);
+  return reinterpret_cast<T>(obj);
+}
+
 void CreateInvokeStub(Assembler* assembler, Method* method);
 
 bool EnsureInvokeStub(Method* method) {
@@ -223,8 +229,7 @@
   std::string descriptor(NormalizeJniClassDescriptor(name));
   // TODO: need to get the appropriate ClassLoader.
   Class* c = class_linker->FindClass(descriptor, NULL);
-  // TODO: AddLocalReference.
-  return reinterpret_cast<jclass>(c);
+  return AddLocalReference<jclass>(ts, c);
 }
 
 jmethodID FromReflectedMethod(JNIEnv* env, jobject method) {
@@ -925,24 +930,21 @@
   va_list ap;
   va_start(ap, methodID);
   JValue result = InvokeWithVarArgs(ts.Self(), NULL, methodID, ap);
-  jobject obj = reinterpret_cast<jobject>(result.l);  // TODO: AddLocalReference
-  return obj;
+  return AddLocalReference<jobject>(ts, result.l);
 }
 
 jobject CallStaticObjectMethodV(JNIEnv* env,
     jclass clazz, jmethodID methodID, va_list args) {
   ScopedJniThreadState ts(env);
   JValue result = InvokeWithVarArgs(ts.Self(), NULL, methodID, args);
-  jobject obj = reinterpret_cast<jobject>(result.l);  // TODO: AddLocalReference
-  return obj;
+  return AddLocalReference<jobject>(ts, result.l);
 }
 
 jobject CallStaticObjectMethodA(JNIEnv* env,
     jclass clazz, jmethodID methodID, jvalue* args) {
   ScopedJniThreadState ts(env);
   JValue result = InvokeWithJValues(ts.Self(), NULL, methodID, args);
-  jobject obj = reinterpret_cast<jobject>(result.l);  // TODO: AddLocalReference
-  return obj;
+  return AddLocalReference<jobject>(ts, result.l);
 }
 
 jboolean CallStaticBooleanMethod(JNIEnv* env,
@@ -1257,8 +1259,12 @@
 
 jstring NewStringUTF(JNIEnv* env, const char* utf) {
   ScopedJniThreadState ts(env);
-  UNIMPLEMENTED(FATAL);
-  return NULL;
+  if (utf == NULL) {
+    return NULL;
+  }
+  size_t char_count = String::ModifiedUtf8Len(utf);
+  String* result = String::AllocFromModifiedUtf8(char_count, utf);
+  return AddLocalReference<jstring>(ts, result);
 }
 
 jsize GetStringUTFLength(JNIEnv* env, jstring str) {
@@ -1291,17 +1297,20 @@
 }
 
 void SetObjectArrayElement(JNIEnv* env,
-    jobjectArray array, jsize index, jobject val) {
+    jobjectArray java_array, jsize index, jobject java_value) {
   ScopedJniThreadState ts(env);
-  UNIMPLEMENTED(FATAL);
+  // TODO: DecodeReference
+  ObjectArray<Object>* array = reinterpret_cast<ObjectArray<Object>*>(java_array);
+  Object* value = reinterpret_cast<Object*>(java_value);
+  // TODO: who should throw? JNI or ObjectArray?
+  array->Set(index, value);
 }
 
 template<typename JniT, typename ArtT>
 JniT NewPrimitiveArray(ScopedJniThreadState& ts, jsize length) {
   CHECK_GE(length, 0); // TODO: ReportJniError
   ArtT* result = ArtT::Alloc(length);
-  // TODO: AddLocalReference
-  return reinterpret_cast<JniT>(result);
+  return AddLocalReference<JniT>(ts, result);
 }
 
 jbooleanArray NewBooleanArray(JNIEnv* env, jsize length) {
@@ -1360,8 +1369,7 @@
 
   ObjectArray<Object>* result = ObjectArray<Object>::Alloc(array_class, length);
   CHECK(initial_element == NULL);  // TODO: support initial_element
-  // TODO: AddLocalReference.
-  return reinterpret_cast<jobjectArray>(result);
+  return AddLocalReference<jobjectArray>(ts, result);
 }
 
 jshortArray NewShortArray(JNIEnv* env, jsize length) {
diff --git a/src/jni_internal_test.cc b/src/jni_internal_test.cc
index df9844f..e5ba913 100644
--- a/src/jni_internal_test.cc
+++ b/src/jni_internal_test.cc
@@ -64,23 +64,23 @@
 
   // TODO: check returned array class.
 
-  CHECK(env_->NewBooleanArray(0) != NULL);
-  CHECK(env_->NewByteArray(0) != NULL);
-  CHECK(env_->NewCharArray(0) != NULL);
-  CHECK(env_->NewDoubleArray(0) != NULL);
-  CHECK(env_->NewFloatArray(0) != NULL);
-  CHECK(env_->NewIntArray(0) != NULL);
-  CHECK(env_->NewLongArray(0) != NULL);
-  CHECK(env_->NewShortArray(0) != NULL);
+  EXPECT_TRUE(env_->NewBooleanArray(0) != NULL);
+  EXPECT_TRUE(env_->NewByteArray(0) != NULL);
+  EXPECT_TRUE(env_->NewCharArray(0) != NULL);
+  EXPECT_TRUE(env_->NewDoubleArray(0) != NULL);
+  EXPECT_TRUE(env_->NewFloatArray(0) != NULL);
+  EXPECT_TRUE(env_->NewIntArray(0) != NULL);
+  EXPECT_TRUE(env_->NewLongArray(0) != NULL);
+  EXPECT_TRUE(env_->NewShortArray(0) != NULL);
 
-  CHECK(env_->NewBooleanArray(1) != NULL);
-  CHECK(env_->NewByteArray(1) != NULL);
-  CHECK(env_->NewCharArray(1) != NULL);
-  CHECK(env_->NewDoubleArray(1) != NULL);
-  CHECK(env_->NewFloatArray(1) != NULL);
-  CHECK(env_->NewIntArray(1) != NULL);
-  CHECK(env_->NewLongArray(1) != NULL);
-  CHECK(env_->NewShortArray(1) != NULL);
+  EXPECT_TRUE(env_->NewBooleanArray(1) != NULL);
+  EXPECT_TRUE(env_->NewByteArray(1) != NULL);
+  EXPECT_TRUE(env_->NewCharArray(1) != NULL);
+  EXPECT_TRUE(env_->NewDoubleArray(1) != NULL);
+  EXPECT_TRUE(env_->NewFloatArray(1) != NULL);
+  EXPECT_TRUE(env_->NewIntArray(1) != NULL);
+  EXPECT_TRUE(env_->NewLongArray(1) != NULL);
+  EXPECT_TRUE(env_->NewShortArray(1) != NULL);
 }
 
 TEST_F(JniInternalTest, NewObjectArray) {
@@ -94,9 +94,16 @@
 
   jclass c = env_->FindClass("[Ljava.lang.String;");
 
-  CHECK(env_->NewObjectArray(0, c, NULL) != NULL);
+  EXPECT_TRUE(env_->NewObjectArray(0, c, NULL) != NULL);
 
-  CHECK(env_->NewObjectArray(1, c, NULL) != NULL);
+  EXPECT_TRUE(env_->NewObjectArray(1, c, NULL) != NULL);
+}
+
+TEST_F(JniInternalTest, NewStringUTF) {
+  EXPECT_TRUE(env_->NewStringUTF(NULL) == NULL);
+  EXPECT_TRUE(env_->NewStringUTF("") != NULL);
+  EXPECT_TRUE(env_->NewStringUTF("hello") != NULL);
+  // TODO: check some non-ASCII strings.
 }
 
 bool EnsureInvokeStub(Method* method);
