Allow late lookup for @CriticalNative methods.

Test: Add and enable tests in 178-app-image-native-method
Test: Add and enable tests in jni_compiler_test
Test: Manually step through the new stub in GDB and check
      that backtrace works at various points.
Test: m test-art-host-gtest
Test: testrunner.py --host --optimizing
Test: aosp_taimen-userdebug boots.
Test: run-gtests.sh
Test: testrunner.py --target --optimizing
Bug: 112189621
Change-Id: If094e5062acbb99eefa88f2afb4815f93730cb82
diff --git a/test/178-app-image-native-method/src/Main.java b/test/178-app-image-native-method/src/Main.java
index bec7740..07990cb 100644
--- a/test/178-app-image-native-method/src/Main.java
+++ b/test/178-app-image-native-method/src/Main.java
@@ -31,17 +31,17 @@
     new TestMissingCritical();
     makeVisiblyInitialized();  // Make sure they are visibly initialized.
 
-    // FIXME: @FastNative and @CriticalNative fail a state check in artFindNativeMethod().
     test();
     testFast();
-    // testCritical();
+    testCritical();
     testMissing();
     testMissingFast();
-    // testMissingCritical();
+    testMissingCritical();
   }
 
   static void test() {
     System.out.println("test");
+    assertEquals(42, Test.nativeMethodVoid());
     assertEquals(42, Test.nativeMethod(42));
     assertEquals(42, Test.nativeMethodWithManyParameters(
         11, 12L, 13.0f, 14.0d,
@@ -56,6 +56,7 @@
 
   static void testFast() {
     System.out.println("testFast");
+    assertEquals(42, TestFast.nativeMethodVoid());
     assertEquals(42, TestFast.nativeMethod(42));
     assertEquals(42, TestFast.nativeMethodWithManyParameters(
         11, 12L, 13.0f, 14.0d,
@@ -70,6 +71,7 @@
 
   static void testCritical() {
     System.out.println("testCritical");
+    assertEquals(42, TestCritical.nativeMethodVoid());
     assertEquals(42, TestCritical.nativeMethod(42));
     assertEquals(42, TestCritical.nativeMethodWithManyParameters(
         11, 12L, 13.0f, 14.0d,
@@ -86,6 +88,11 @@
     System.out.println("testMissing");
 
     try {
+      TestMissing.nativeMethodVoid();
+      throw new Error("UNREACHABLE");
+    } catch (LinkageError expected) {}
+
+    try {
       TestMissing.nativeMethod(42);
       throw new Error("UNREACHABLE");
     } catch (LinkageError expected) {}
@@ -108,6 +115,11 @@
     System.out.println("testMissingFast");
 
     try {
+      TestMissingFast.nativeMethodVoid();
+      throw new Error("UNREACHABLE");
+    } catch (LinkageError expected) {}
+
+    try {
       TestMissingFast.nativeMethod(42);
       throw new Error("UNREACHABLE");
     } catch (LinkageError expected) {}
@@ -130,6 +142,11 @@
     System.out.println("testMissingCritical");
 
     try {
+      TestMissingCritical.nativeMethodVoid();
+      throw new Error("UNREACHABLE");
+    } catch (LinkageError expected) {}
+
+    try {
       TestMissingCritical.nativeMethod(42);
       throw new Error("UNREACHABLE");
     } catch (LinkageError expected) {}
@@ -158,6 +175,8 @@
 }
 
 class Test {
+  public static native int nativeMethodVoid();
+
   public static native int nativeMethod(int i);
 
   public static native int nativeMethodWithManyParameters(
@@ -173,6 +192,9 @@
 
 class TestFast {
   @FastNative
+  public static native int nativeMethodVoid();
+
+  @FastNative
   public static native int nativeMethod(int i);
 
   @FastNative
@@ -189,6 +211,9 @@
 
 class TestCritical {
   @CriticalNative
+  public static native int nativeMethodVoid();
+
+  @CriticalNative
   public static native int nativeMethod(int i);
 
   @CriticalNative
@@ -204,6 +229,8 @@
 }
 
 class TestMissing {
+  public static native int nativeMethodVoid();
+
   public static native int nativeMethod(int i);
 
   public static native int nativeMethodWithManyParameters(
@@ -219,6 +246,9 @@
 
 class TestMissingFast {
   @FastNative
+  public static native int nativeMethodVoid();
+
+  @FastNative
   public static native int nativeMethod(int i);
 
   @FastNative
@@ -235,6 +265,9 @@
 
 class TestMissingCritical {
   @CriticalNative
+  public static native int nativeMethodVoid();
+
+  @CriticalNative
   public static native int nativeMethod(int i);
 
   @CriticalNative