Patch LittleMock for change in internal methods

Bug: 8297640
Change-Id: I0a18ec915ec69170e8a4cfc80a211fd07be9df00
diff --git a/README b/README
index 86b8be6..847dac9 100644
--- a/README
+++ b/README
@@ -14,4 +14,5 @@
 Local Modifications:
 - Change to AppDataDirGuesser to handle the new class loader toString
   format introduced in JB.
-
+- bug8297640.patch: update instantiation code to handle change in internal
+  methods
diff --git a/bug-8297640.patch b/bug-8297640.patch
new file mode 100644
index 0000000..24f2c69
--- /dev/null
+++ b/bug-8297640.patch
@@ -0,0 +1,22 @@
+Index: src/com/google/testing/littlemock/LittleMock.java
+===================================================================
+--- src/com/google/testing/littlemock/LittleMock.java	(revision 19)
++++ src/com/google/testing/littlemock/LittleMock.java	(working copy)
+@@ -1268,6 +1268,17 @@
+       newInstance.setAccessible(true);
+       return (T) newInstance.invoke(null, clazz, constructorId);
+     } catch (Exception ignored) {}
++    // try dalvikvm, with change https://android-review.googlesource.com/#/c/52331/
++    try {
++      Method getConstructorId = ObjectStreamClass.class
++          .getDeclaredMethod("getConstructorId", Class.class);
++      getConstructorId.setAccessible(true);
++      final long constructorId = (Long) getConstructorId.invoke(null, Object.class);
++      final Method newInstance = ObjectStreamClass.class
++          .getDeclaredMethod("newInstance", Class.class, long.class);
++      newInstance.setAccessible(true);
++      return (T) newInstance.invoke(null, clazz, constructorId);
++    } catch (Exception ignored) {}
+     throw new IllegalStateException("unsafe create instance failed");
+   }
+ 
diff --git a/src/com/google/testing/littlemock/LittleMock.java b/src/com/google/testing/littlemock/LittleMock.java
index 140f853..0e96938 100644
--- a/src/com/google/testing/littlemock/LittleMock.java
+++ b/src/com/google/testing/littlemock/LittleMock.java
@@ -1314,6 +1314,17 @@
       newInstance.setAccessible(true);
       return (T) newInstance.invoke(null, clazz, constructorId);
     } catch (Exception ignored) {}
+    // try dalvikvm, with change https://android-review.googlesource.com/#/c/52331/
+    try {
+      Method getConstructorId = ObjectStreamClass.class
+          .getDeclaredMethod("getConstructorId", Class.class);
+      getConstructorId.setAccessible(true);
+      final long constructorId = (Long) getConstructorId.invoke(null, Object.class);
+      final Method newInstance = ObjectStreamClass.class
+          .getDeclaredMethod("newInstance", Class.class, long.class);
+      newInstance.setAccessible(true);
+      return (T) newInstance.invoke(null, clazz, constructorId);
+    } catch (Exception ignored) {}
     throw new IllegalStateException("unsafe create instance failed");
   }