Merge "Change LoadNativeLibrary to use GetOrCreateAllocator"
diff --git a/runtime/java_vm_ext.cc b/runtime/java_vm_ext.cc
index 7cc05f7..58da7f2 100644
--- a/runtime/java_vm_ext.cc
+++ b/runtime/java_vm_ext.cc
@@ -736,7 +736,7 @@
     // it's okay to decode it without worrying about unexpectedly marking it alive.
     mirror::ClassLoader* loader = soa.Decode<mirror::ClassLoader*>(class_loader);
     class_loader_allocator =
-        Runtime::Current()->GetClassLinker()->GetAllocatorForClassLoader(loader);
+        Runtime::Current()->GetClassLinker()->GetOrCreateAllocatorForClassLoader(loader);
     CHECK(class_loader_allocator != nullptr);
   }
   if (library != nullptr) {
diff --git a/test/068-classloader/expected.txt b/test/068-classloader/expected.txt
index 8725799..36e4f48 100644
--- a/test/068-classloader/expected.txt
+++ b/test/068-classloader/expected.txt
@@ -13,3 +13,4 @@
 Got LinkageError on IDI (early)
 class Main
 Got expected ClassNotFoundException
+JNI_OnLoad called
diff --git a/test/068-classloader/src/FancyLoader.java b/test/068-classloader/src/FancyLoader.java
index 6a153cc..b8eac7b 100644
--- a/test/068-classloader/src/FancyLoader.java
+++ b/test/068-classloader/src/FancyLoader.java
@@ -38,7 +38,7 @@
     static final String CLASS_PATH = "classes-ex/";
 
     /* this is the "alternate" DEX/Jar file */
-    static final String DEX_FILE = System.getenv("DEX_LOCATION") + "/068-classloader-ex.jar";
+    public static final String DEX_FILE = System.getenv("DEX_LOCATION") + "/068-classloader-ex.jar";
 
     /* on Dalvik, this is a DexFile; otherwise, it's null */
     private Class mDexClass;
diff --git a/test/068-classloader/src/Main.java b/test/068-classloader/src/Main.java
index 361e293..e3bf82c 100644
--- a/test/068-classloader/src/Main.java
+++ b/test/068-classloader/src/Main.java
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
 /**
  * Class loader test.
  */
@@ -62,6 +64,28 @@
         testSeparation();
 
         testClassForName();
+
+        // Attempt to load without a class table, regression test for b/25866849.
+        testLoadNativeLibrary(args[0]);
+    }
+
+    static void testLoadNativeLibrary(String libName) throws Exception {
+        Class pathClassLoader = Class.forName("dalvik.system.PathClassLoader");
+        if (pathClassLoader == null) {
+            throw new AssertionError("Couldn't find path class loader class");
+        }
+        Constructor constructor =
+            pathClassLoader.getDeclaredConstructor(String.class, ClassLoader.class);
+        ClassLoader loader = (ClassLoader) constructor.newInstance(
+            FancyLoader.DEX_FILE, ClassLoader.getSystemClassLoader());
+        Runtime runtime = Runtime.getRuntime();
+        Method method = runtime.getClass().getDeclaredMethod("loadLibrary", String.class,
+            ClassLoader.class);
+        if (method == null) {
+            throw new RuntimeException("loadLibrary not found");
+        }
+        method.setAccessible(true);
+        method.invoke(runtime, libName, loader);
     }
 
     static void testSeparation() {