From ed77f7e1d6e3fbf1c6793899ede37c4fe5c7b3b8 Mon Sep 17 00:00:00 2001 From: Marvin W Date: Wed, 2 Mar 2016 21:24:41 +0100 Subject: [PATCH] Move native lib loader to BackendMapView --- .../org/microg/gms/maps/BackendMapView.java | 66 ++++++++++++++++++- .../org/microg/gms/maps/GoogleMapImpl.java | 59 ----------------- 2 files changed, 64 insertions(+), 61 deletions(-) diff --git a/play-services-core/src/main/java/org/microg/gms/maps/BackendMapView.java b/play-services-core/src/main/java/org/microg/gms/maps/BackendMapView.java index 9b7e6530..b12110c4 100644 --- a/play-services-core/src/main/java/org/microg/gms/maps/BackendMapView.java +++ b/play-services-core/src/main/java/org/microg/gms/maps/BackendMapView.java @@ -17,8 +17,10 @@ package org.microg.gms.maps; import android.content.Context; +import android.content.pm.ApplicationInfo; import android.graphics.BitmapFactory; import android.util.AttributeSet; +import android.util.Log; import com.google.android.gms.R; @@ -37,12 +39,72 @@ import org.oscim.theme.VtmThemes; import org.oscim.tiling.ITileCache; import org.oscim.tiling.source.oscimap4.OSciMap4TileSource; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Enumeration; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + public class BackendMapView extends MapView { + private static final String TAG = "GmsMapView"; + + private static boolean nativeLibLoaded = false; private LabelLayer labels; private BuildingLayer buildings; private ItemizedLayer items; private ClearableVectorLayer drawables; + static synchronized Context loadNativeLib(Context context) { + try { + if (nativeLibLoaded) return context; + ApplicationInfo otherAppInfo = context.getPackageManager().getApplicationInfo(context.getApplicationContext().getPackageName(), 0); + + String primaryCpuAbi = (String) ApplicationInfo.class.getField("primaryCpuAbi").get(otherAppInfo); + if (primaryCpuAbi != null) { + String path = "lib/" + primaryCpuAbi + "/libvtm-jni.so"; + File cacheFile = new File(context.getApplicationContext().getCacheDir().getAbsolutePath() + "/.gmscore/" + path); + cacheFile.getParentFile().mkdirs(); + File apkFile = new File(context.getPackageCodePath()); + if (!cacheFile.exists() || cacheFile.lastModified() < apkFile.lastModified()) { + ZipFile zipFile = new ZipFile(apkFile); + ZipEntry entry = zipFile.getEntry(path); + if (entry != null) { + copyInputStream(zipFile.getInputStream(entry), new FileOutputStream(cacheFile)); + } else { + Log.d(TAG, "Can't load native library: " + path + " does not exist in " + apkFile); + Enumeration entries = zipFile.entries(); + while (entries.hasMoreElements()) { + Log.d(TAG, "but: " + entries.nextElement()); + } + } + } + Log.d(TAG, "Loading vtm-jni from " + cacheFile.getPath()); + System.load(cacheFile.getAbsolutePath()); + } else { + Log.d(TAG, "Loading native vtm-jni"); + System.loadLibrary("vtm-jni"); + } + nativeLibLoaded = true; + } catch (Exception e) { + Log.w(TAG, e); + } + return context; + } + + private static final void copyInputStream(InputStream in, OutputStream out) throws IOException { + byte[] buffer = new byte[1024]; + int len; + + while ((len = in.read(buffer)) >= 0) + out.write(buffer, 0, len); + + in.close(); + out.close(); + } + @Override public void onResume() { super.onResume(); @@ -54,12 +116,12 @@ public class BackendMapView extends MapView { } public BackendMapView(Context context) { - super(context); + super(loadNativeLib(context)); initialize(); } public BackendMapView(Context context, AttributeSet attributeSet) { - super(context, attributeSet); + super(loadNativeLib(context), attributeSet); initialize(); } diff --git a/play-services-core/src/main/java/org/microg/gms/maps/GoogleMapImpl.java b/play-services-core/src/main/java/org/microg/gms/maps/GoogleMapImpl.java index 83b4afe2..69409df8 100644 --- a/play-services-core/src/main/java/org/microg/gms/maps/GoogleMapImpl.java +++ b/play-services-core/src/main/java/org/microg/gms/maps/GoogleMapImpl.java @@ -18,7 +18,6 @@ package org.microg.gms.maps; import android.app.Activity; import android.content.Context; -import android.content.pm.ApplicationInfo; import android.location.Criteria; import android.location.Location; import android.location.LocationListener; @@ -75,15 +74,6 @@ import org.microg.gms.maps.markup.PolygonImpl; import org.microg.gms.maps.markup.PolylineImpl; import org.microg.gms.maps.markup.TileOverlayImpl; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.Enumeration; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; - import static android.Manifest.permission.ACCESS_COARSE_LOCATION; import static android.Manifest.permission.ACCESS_FINE_LOCATION; import static android.content.pm.PackageManager.PERMISSION_GRANTED; @@ -91,7 +81,6 @@ import static android.content.pm.PackageManager.PERMISSION_GRANTED; public class GoogleMapImpl extends IGoogleMapDelegate.Stub implements UiSettingsImpl.UiSettingsListener, Markup.MarkupListener, BackendMap.CameraUpdateListener { private static final String TAG = "GoogleMapImpl"; - private static boolean nativeLibLoaded = false; private final GoogleMapOptions options; private final Context context; @@ -141,7 +130,6 @@ public class GoogleMapImpl extends IGoogleMapDelegate.Stub Context appContext = context; if (appContext.getApplicationContext() != null) appContext = appContext.getApplicationContext(); Context wrappedContext = RemoteContextWrapper.fromApplicationContext(appContext); - loadNativeLib(wrappedContext); backendMap = new BackendMap(wrappedContext, this); uiSettings = new UiSettingsImpl(this); projection = new ProjectionImpl(backendMap.getViewport()); @@ -154,53 +142,6 @@ public class GoogleMapImpl extends IGoogleMapDelegate.Stub if (options != null) initFromOptions(); } - private static final void copyInputStream(InputStream in, OutputStream out) throws IOException { - byte[] buffer = new byte[1024]; - int len; - - while ((len = in.read(buffer)) >= 0) - out.write(buffer, 0, len); - - in.close(); - out.close(); - } - - private static synchronized void loadNativeLib(Context context) { - try { - if (nativeLibLoaded) return; - ApplicationInfo otherAppInfo = context.getPackageManager().getApplicationInfo(context.getApplicationContext().getPackageName(), 0); - - String primaryCpuAbi = (String) ApplicationInfo.class.getField("primaryCpuAbi").get(otherAppInfo); - if (primaryCpuAbi != null) { - String path = "lib/" + primaryCpuAbi + "/libvtm-jni.so"; - File cacheFile = new File(context.getApplicationContext().getCacheDir().getAbsolutePath() + "/.gmscore/" + path); - cacheFile.getParentFile().mkdirs(); - File apkFile = new File(context.getPackageCodePath()); - if (!cacheFile.exists() || cacheFile.lastModified() < apkFile.lastModified()) { - ZipFile zipFile = new ZipFile(apkFile); - ZipEntry entry = zipFile.getEntry(path); - if (entry != null) { - copyInputStream(zipFile.getInputStream(entry), new FileOutputStream(cacheFile)); - } else { - Log.d(TAG, "Can't load native library: " + path + " does not exist in " + apkFile); - Enumeration entries = zipFile.entries(); - while (entries.hasMoreElements()) { - Log.d(TAG, "but: " + entries.nextElement()); - } - } - } - Log.d(TAG, "Loading vtm-jni from " + cacheFile.getPath()); - System.load(cacheFile.getAbsolutePath()); - } else { - Log.d(TAG, "Loading native vtm-jni"); - System.loadLibrary("vtm-jni"); - } - nativeLibLoaded = true; - } catch (Exception e) { - Log.w(TAG, e); - } - } - private void initFromOptions() { try { uiSettings.setCompassEnabled(options.isCompassEnabled());