Merge "Use shared namespace for bundled apps"
diff --git a/dalvik/src/main/java/dalvik/system/BaseDexClassLoader.java b/dalvik/src/main/java/dalvik/system/BaseDexClassLoader.java
index 0e112fc..e329a4c 100644
--- a/dalvik/src/main/java/dalvik/system/BaseDexClassLoader.java
+++ b/dalvik/src/main/java/dalvik/system/BaseDexClassLoader.java
@@ -28,6 +28,7 @@
  */
 public class BaseDexClassLoader extends ClassLoader {
     private final DexPathList pathList;
+    private final boolean sharedNamespace;
 
     /**
      * Constructs an instance.
@@ -46,7 +47,7 @@
      */
     public BaseDexClassLoader(String dexPath, File optimizedDirectory,
             String librarySearchPath, ClassLoader parent) {
-        this(dexPath, optimizedDirectory, librarySearchPath, null, parent);
+        this(dexPath, optimizedDirectory, false, librarySearchPath, null, parent);
     }
 
     /**
@@ -57,6 +58,11 @@
      * defaults to {@code ":"} on Android
      * @param optimizedDirectory directory where optimized dex files
      * should be written; may be {@code null}
+     * @param isSharedNamespace whether this classloader should use the shared linker
+     * namespace. If the shared linker namespace is used, the classloader will have
+     * access to all native libraries loaded by the platform. This should be limited
+     * to the classloaders used by the bundled apps - bundled apps are part of the
+     * platform
      * @param librarySearchPath the list of directories containing native
      * libraries, delimited by {@code File.pathSeparator}; may be
      * {@code null}; directories in this list are used to search for
@@ -72,11 +78,12 @@
      *
      * @hide
      */
-    public BaseDexClassLoader(String dexPath, File optimizedDirectory,
+    public BaseDexClassLoader(String dexPath, File optimizedDirectory, boolean isSharedNamespace,
             String librarySearchPath, String libraryPermittedPath, ClassLoader parent) {
         super(parent);
         this.pathList = new DexPathList(this, dexPath, librarySearchPath,
                                         libraryPermittedPath, optimizedDirectory);
+        this.sharedNamespace = isSharedNamespace;
     }
 
     @Override
@@ -172,6 +179,13 @@
         return pathList.getLibraryPermittedPath();
     }
 
+    /**
+     * @hide
+     */
+    public boolean isSharedNamespace() {
+      return sharedNamespace;
+    }
+
     @Override public String toString() {
         return getClass().getName() + "[" + pathList + "]";
     }
diff --git a/dalvik/src/main/java/dalvik/system/DexClassLoader.java b/dalvik/src/main/java/dalvik/system/DexClassLoader.java
index 4bbdbd8..3a584e8 100644
--- a/dalvik/src/main/java/dalvik/system/DexClassLoader.java
+++ b/dalvik/src/main/java/dalvik/system/DexClassLoader.java
@@ -56,7 +56,7 @@
      */
     public DexClassLoader(String dexPath, String optimizedDirectory,
             String librarySearchPath, ClassLoader parent) {
-        super(dexPath, new File(optimizedDirectory), librarySearchPath, null, parent);
+        super(dexPath, new File(optimizedDirectory), false, librarySearchPath, null, parent);
     }
 
     /**
@@ -88,7 +88,7 @@
      */
     public DexClassLoader(String dexPath, String optimizedDirectory,
             String librarySearchPath, String libraryPermittedPath, ClassLoader parent) {
-        super(dexPath, new File(optimizedDirectory), librarySearchPath,
+        super(dexPath, new File(optimizedDirectory), false, librarySearchPath,
               libraryPermittedPath, parent);
     }
 }
diff --git a/dalvik/src/main/java/dalvik/system/PathClassLoader.java b/dalvik/src/main/java/dalvik/system/PathClassLoader.java
index 83b4366..5375935 100644
--- a/dalvik/src/main/java/dalvik/system/PathClassLoader.java
+++ b/dalvik/src/main/java/dalvik/system/PathClassLoader.java
@@ -35,7 +35,7 @@
      * @param parent the parent class loader
      */
     public PathClassLoader(String dexPath, ClassLoader parent) {
-        super(dexPath, null, null, null, parent);
+        super(dexPath, null, false, null, null, parent);
     }
 
     /**
@@ -63,7 +63,7 @@
      * This method will be deprecated in the next release
      */
     public PathClassLoader(String dexPath, String librarySearchPath, ClassLoader parent) {
-        super(dexPath, null, librarySearchPath, null, parent);
+        super(dexPath, null, false, librarySearchPath, null, parent);
     }
 
     /**
@@ -83,6 +83,11 @@
      * @param dexPath the list of jar/apk files containing classes and
      * resources, delimited by {@code File.pathSeparator}, which
      * defaults to {@code ":"} on Android
+     * @param isSharedNamespace whether this classloader should use the shared linker
+     * namespace. If the shared linker namespace is used, the classloader will have
+     * access to all native libraries loaded by the platform. This should be limited
+     * to the classloaders used by the bundled apps - bundled apps are part of the
+     * platform
      * @param librarySearchPath the list of directories containing native
      * libraries, delimited by {@code File.pathSeparator}; may be
      * {@code null}
@@ -95,8 +100,8 @@
      *
      * @hide
      */
-    public PathClassLoader(String dexPath, String librarySearchPath, String libraryPermittedPath,
-            ClassLoader parent) {
-        super(dexPath, null, librarySearchPath, libraryPermittedPath, parent);
+    public PathClassLoader(String dexPath, boolean isSharedNamespace, String librarySearchPath,
+            String libraryPermittedPath, ClassLoader parent) {
+        super(dexPath, null, isSharedNamespace, librarySearchPath, libraryPermittedPath, parent);
     }
 }
diff --git a/luni/src/main/java/java/lang/Runtime.java b/luni/src/main/java/java/lang/Runtime.java
index 5b86346..178ff89 100644
--- a/luni/src/main/java/java/lang/Runtime.java
+++ b/luni/src/main/java/java/lang/Runtime.java
@@ -418,30 +418,33 @@
         // dlopen(3) calls made from a .so's JNI_OnLoad to work too.
 
         // So, find out what the native library search path is for the ClassLoader in question...
-        String ldLibraryPath = null;
-        String permittedPath = null;
+        String librarySearchPath = null;
+        String libraryPermittedPath = null;
+        boolean isSharedNamespace = false;
         String dexPath = null;
         if (loader == null) {
             // We use the given library path for the boot class loader. This is the path
             // also used in loadLibraryName if loader is null.
-            ldLibraryPath = System.getProperty("java.library.path");
+            librarySearchPath = System.getProperty("java.library.path");
         } else if (loader instanceof BaseDexClassLoader) {
             BaseDexClassLoader dexClassLoader = (BaseDexClassLoader) loader;
-            ldLibraryPath = dexClassLoader.getLdLibraryPath();
-            permittedPath = dexClassLoader.getLibraryPermittedPath();
+            librarySearchPath = dexClassLoader.getLdLibraryPath();
+            libraryPermittedPath = dexClassLoader.getLibraryPermittedPath();
+            isSharedNamespace = dexClassLoader.isSharedNamespace();
         }
 
         // nativeLoad should be synchronized so there's only one LD_LIBRARY_PATH in use regardless
         // of how many ClassLoaders are in the system, but dalvik doesn't support synchronized
         // internal natives.
         synchronized (this) {
-            return nativeLoad(name, loader, ldLibraryPath, permittedPath);
+            return nativeLoad(name, loader, isSharedNamespace,
+                              librarySearchPath, libraryPermittedPath);
         }
     }
 
     // TODO: should be synchronized, but dalvik doesn't support synchronized internal natives.
     private static native String nativeLoad(String filename, ClassLoader loader,
-            String ldLibraryPath, String libraryPermittedPath);
+            boolean isSharedNamespace, String librarySearchPath, String libraryPermittedPath);
 
     /**
      * Provides a hint to the runtime that it would be useful to attempt