Implement more of the exception/object/class JNI functions.

Change-Id: Id835c1a37e5034d11e2fc43ccf49e578510abfc1
diff --git a/src/jni_internal_test.cc b/src/jni_internal_test.cc
index 62f6068..f205169 100644
--- a/src/jni_internal_test.cc
+++ b/src/jni_internal_test.cc
@@ -318,6 +318,20 @@
   // Already tested in NewObjectArray/NewPrimitiveArray.
 }
 
+TEST_F(JniInternalTest, GetObjectClass) {
+  jclass string_class = env_->FindClass("java/lang/String");
+  ASSERT_TRUE(string_class != NULL);
+  jclass class_class = env_->FindClass("java/lang/Class");
+  ASSERT_TRUE(class_class != NULL);
+
+  jstring s = env_->NewStringUTF("poop");
+  jclass c = env_->GetObjectClass(s);
+  ASSERT_TRUE(env_->IsSameObject(string_class, c));
+
+  jclass c2 = env_->GetObjectClass(c);
+  ASSERT_TRUE(env_->IsSameObject(class_class, env_->GetObjectClass(c2)));
+}
+
 TEST_F(JniInternalTest, GetSuperclass) {
   jclass object_class = env_->FindClass("java/lang/Object");
   ASSERT_TRUE(object_class != NULL);
@@ -327,6 +341,16 @@
   ASSERT_TRUE(env_->GetSuperclass(object_class) == NULL);
 }
 
+TEST_F(JniInternalTest, IsAssignableFrom) {
+  jclass object_class = env_->FindClass("java/lang/Object");
+  ASSERT_TRUE(object_class != NULL);
+  jclass string_class = env_->FindClass("java/lang/String");
+  ASSERT_TRUE(string_class != NULL);
+
+  ASSERT_TRUE(env_->IsAssignableFrom(object_class, string_class));
+  ASSERT_FALSE(env_->IsAssignableFrom(string_class, object_class));
+}
+
 TEST_F(JniInternalTest, NewStringUTF) {
   EXPECT_TRUE(env_->NewStringUTF(NULL) == NULL);
   EXPECT_TRUE(env_->NewStringUTF("") != NULL);
@@ -1254,4 +1278,30 @@
 }
 #endif  // __arm__
 
+TEST_F(JniInternalTest, Throw) {
+  EXPECT_EQ(JNI_ERR, env_->Throw(NULL));
+
+  jclass exception_class = env_->FindClass("java/lang/RuntimeException");
+  ASSERT_TRUE(exception_class != NULL);
+  jthrowable exception = reinterpret_cast<jthrowable>(env_->AllocObject(exception_class));
+  ASSERT_TRUE(exception != NULL);
+
+  EXPECT_EQ(JNI_OK, env_->Throw(exception));
+  EXPECT_TRUE(env_->ExceptionCheck());
+  EXPECT_TRUE(env_->IsSameObject(exception, env_->ExceptionOccurred()));
+  env_->ExceptionClear();
+}
+
+TEST_F(JniInternalTest, ThrowNew) {
+  EXPECT_EQ(JNI_ERR, env_->Throw(NULL));
+
+  jclass exception_class = env_->FindClass("java/lang/RuntimeException");
+  ASSERT_TRUE(exception_class != NULL);
+
+  EXPECT_EQ(JNI_OK, env_->ThrowNew(exception_class, "hello world"));
+  EXPECT_TRUE(env_->ExceptionCheck());
+  EXPECT_TRUE(env_->IsInstanceOf(env_->ExceptionOccurred(), exception_class));
+  env_->ExceptionClear();
+}
+
 }