Stash the directly-implemented interfaces in Proxy so we can implement Class.getInterfaces.

Also extend test 044 to spot this (found by a libcore test).

Change-Id: I50019db49c549f045d94173c3ed9ae81f05ef858
diff --git a/src/java_lang_Class.cc b/src/java_lang_Class.cc
index 3dce559..567a067 100644
--- a/src/java_lang_Class.cc
+++ b/src/java_lang_Class.cc
@@ -288,6 +288,12 @@
   return AddLocalReference<jstring>(env, c->ComputeName());
 }
 
+static jobjectArray Class_getProxyInterfaces(JNIEnv* env, jobject javaThis) {
+  ScopedThreadStateChange tsc(Thread::Current(), Thread::kRunnable);
+  SynthesizedProxyClass* c = down_cast<SynthesizedProxyClass*>(Decode<Class*>(env, javaThis));
+  return AddLocalReference<jobjectArray>(env, c->GetInterfaces()->Clone());
+}
+
 static jboolean Class_isAssignableFrom(JNIEnv* env, jobject javaLhs, jclass javaRhs) {
   ScopedThreadStateChange tsc(Thread::Current(), Thread::kRunnable);
   Class* lhs = Decode<Class*>(env, javaLhs);
@@ -410,6 +416,7 @@
   NATIVE_METHOD(Class, getDeclaredMethods, "(Z)[Ljava/lang/reflect/Method;"),
   NATIVE_METHOD(Class, getDex, "()Lcom/android/dex/Dex;"),
   NATIVE_METHOD(Class, getNameNative, "()Ljava/lang/String;"),
+  NATIVE_METHOD(Class, getProxyInterfaces, "()[Ljava/lang/Class;"),
   NATIVE_METHOD(Class, isAssignableFrom, "(Ljava/lang/Class;)Z"),
   NATIVE_METHOD(Class, isInstance, "(Ljava/lang/Object;)Z"),
   NATIVE_METHOD(Class, newInstanceImpl, "()Ljava/lang/Object;"),