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/expected.txt b/test/178-app-image-native-method/expected.txt
index 6327f97..30cc336 100644
--- a/test/178-app-image-native-method/expected.txt
+++ b/test/178-app-image-native-method/expected.txt
@@ -1,10 +1,14 @@
 JNI_OnLoad called
 test
 testFast
+testCritical
 testMissing
 testMissingFast
+testMissingCritical
 JNI_OnLoad called
 test
 testFast
+testCritical
 testMissing
 testMissingFast
+testMissingCritical
diff --git a/test/178-app-image-native-method/native_methods.cc b/test/178-app-image-native-method/native_methods.cc
index 5c4fb3e..794a78a 100644
--- a/test/178-app-image-native-method/native_methods.cc
+++ b/test/178-app-image-native-method/native_methods.cc
@@ -38,6 +38,10 @@
       (i8 == 81) && (l8 == 82) && (f8 == 83.0) && (d8 == 84.0);
 }
 
+extern "C" JNIEXPORT jint JNICALL Java_Test_nativeMethodVoid(JNIEnv*, jclass) {
+  return 42;
+}
+
 extern "C" JNIEXPORT jint JNICALL Java_Test_nativeMethod(JNIEnv*, jclass, jint i) {
   return i;
 }
@@ -64,6 +68,10 @@
   return ok ? 42 : -1;
 }
 
+extern "C" JNIEXPORT jint JNICALL Java_TestFast_nativeMethodVoid(JNIEnv*, jclass) {
+  return 42;
+}
+
 extern "C" JNIEXPORT jint JNICALL Java_TestFast_nativeMethod(JNIEnv*, jclass, jint i) {
   return i;
 }
@@ -90,6 +98,10 @@
   return ok ? 42 : -1;
 }
 
+extern "C" JNIEXPORT jint JNICALL Java_TestCritical_nativeMethodVoid() {
+  return 42;
+}
+
 extern "C" JNIEXPORT jint JNICALL Java_TestCritical_nativeMethod(jint i) {
   return i;
 }
diff --git a/test/178-app-image-native-method/run b/test/178-app-image-native-method/run
index 3cb4d09..f4b07f0 100644
--- a/test/178-app-image-native-method/run
+++ b/test/178-app-image-native-method/run
@@ -22,4 +22,4 @@
 ${RUN} ${@} --profile -Xcompiler-option --compiler-filter=verify
 return_status2=$?
 
-(exit ${return_status1}) # && (exit ${return_status2})
+(exit ${return_status1}) && (exit ${return_status2})
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