Class.isAssignableFrom and Class.isInstance.

Change-Id: I5fd52a80a08cad1ca98f7e13a6cf56add952d8af
diff --git a/src/java_lang_Class.cc b/src/java_lang_Class.cc
index 69ad910..ec0b0ed 100644
--- a/src/java_lang_Class.cc
+++ b/src/java_lang_Class.cc
@@ -198,6 +198,25 @@
   return JNI_FALSE;
 }
 
+jboolean Class_isAssignableFrom(JNIEnv* env, jobject javaLhs, jclass javaRhs) {
+  Class* lhs = Decode<Class*>(env, javaLhs);
+  Class* rhs = Decode<Class*>(env, javaRhs);
+  if (rhs == NULL) {
+    Thread::Current()->ThrowNewException("Ljava/lang/NullPointerException;", "class == null");
+    return JNI_FALSE;
+  }
+  return lhs->IsAssignableFrom(rhs) ? JNI_TRUE : JNI_FALSE;
+}
+
+jboolean Class_isInstance(JNIEnv* env, jobject javaClass, jobject javaObject) {
+  Class* c = Decode<Class*>(env, javaClass);
+  Object* o = Decode<Object*>(env, javaObject);
+  if (o == NULL) {
+    return JNI_FALSE;
+  }
+  return Object::InstanceOf(o, c) ? JNI_TRUE : JNI_FALSE;
+}
+
 jboolean Class_isInterface(JNIEnv* env, jobject javaThis) {
   Class* c = Decode<Class*>(env, javaThis);
   return c->IsInterface();
@@ -320,8 +339,8 @@
   NATIVE_METHOD(Class, getNameNative, "()Ljava/lang/String;"),
   NATIVE_METHOD(Class, getSuperclass, "()Ljava/lang/Class;"),
   NATIVE_METHOD(Class, isAnonymousClass, "()Z"),
-  //NATIVE_METHOD(Class, isAssignableFrom, "(Ljava/lang/Class;)Z"),
-  //NATIVE_METHOD(Class, isInstance, "(Ljava/lang/Object;)Z"),
+  NATIVE_METHOD(Class, isAssignableFrom, "(Ljava/lang/Class;)Z"),
+  NATIVE_METHOD(Class, isInstance, "(Ljava/lang/Object;)Z"),
   NATIVE_METHOD(Class, isInterface, "()Z"),
   NATIVE_METHOD(Class, isPrimitive, "()Z"),
   NATIVE_METHOD(Class, newInstanceImpl, "()Ljava/lang/Object;"),