aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--platform_tools/android/apps/viewer/build.gradle2
-rw-r--r--platform_tools/android/apps/viewer/src/main/assets/.gitignore1
-rw-r--r--platform_tools/android/apps/viewer/src/main/java/org/skia/viewer/ViewerApplication.java5
-rwxr-xr-xplatform_tools/android/bin/android_build_universal_viewer81
-rw-r--r--tools/sk_app/android/surface_glue_android.cpp31
5 files changed, 116 insertions, 4 deletions
diff --git a/platform_tools/android/apps/viewer/build.gradle b/platform_tools/android/apps/viewer/build.gradle
index d39e896c41..630544d0bb 100644
--- a/platform_tools/android/apps/viewer/build.gradle
+++ b/platform_tools/android/apps/viewer/build.gradle
@@ -24,7 +24,7 @@ android {
}
sourceSets.main.jni.srcDirs = [] //disable automatic ndk-build call
sourceSets.main.jniLibs.srcDir "src/main/libs"
- productFlavors { arm {}; arm64 {}; x86 {}; x64 {}; arm64vulkan{}; }
+ productFlavors { universal{}; arm {}; arm64 {}; x86 {}; x64 {}; arm64vulkan{}; }
setupSkiaLibraryBuild(project, applicationVariants, "libviewer")
}
diff --git a/platform_tools/android/apps/viewer/src/main/assets/.gitignore b/platform_tools/android/apps/viewer/src/main/assets/.gitignore
new file mode 100644
index 0000000000..e47e1b33a7
--- /dev/null
+++ b/platform_tools/android/apps/viewer/src/main/assets/.gitignore
@@ -0,0 +1 @@
+/resources
diff --git a/platform_tools/android/apps/viewer/src/main/java/org/skia/viewer/ViewerApplication.java b/platform_tools/android/apps/viewer/src/main/java/org/skia/viewer/ViewerApplication.java
index 2dcce90e63..7253eb7503 100644
--- a/platform_tools/android/apps/viewer/src/main/java/org/skia/viewer/ViewerApplication.java
+++ b/platform_tools/android/apps/viewer/src/main/java/org/skia/viewer/ViewerApplication.java
@@ -8,6 +8,7 @@
package org.skia.viewer;
import android.app.Application;
+import android.content.res.AssetManager;
public class ViewerApplication extends Application {
private long mNativeHandle = 0;
@@ -18,13 +19,13 @@ public class ViewerApplication extends Application {
System.loadLibrary("viewer");
}
- private native long createNativeApp();
+ private native long createNativeApp(AssetManager assetManager);
private native void destroyNativeApp(long handle);
@Override
public void onCreate() {
super.onCreate();
- mNativeHandle = createNativeApp();
+ mNativeHandle = createNativeApp(this.getResources().getAssets());
}
@Override
diff --git a/platform_tools/android/bin/android_build_universal_viewer b/platform_tools/android/bin/android_build_universal_viewer
new file mode 100755
index 0000000000..f98eeb8088
--- /dev/null
+++ b/platform_tools/android/bin/android_build_universal_viewer
@@ -0,0 +1,81 @@
+#! /bin/sh
+
+# Copyright 2018 Google Inc.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+make_gn() {
+ #TODO: make this more configurable
+ cat << EOF
+ target_cpu = "$ARCH"
+ is_debug = false
+ ndk = "$ANDROID_NDK"
+ ndk_api = 26
+EOF
+}
+
+main() {
+ APP="$1"
+ LIB="$2"
+
+ ANDROID_NDK="$(cd "$ANDROID_NDK"; pwd)"
+ ANDROID_HOME="$(cd "$ANDROID_HOME"; pwd)"
+
+ cd "$(dirname "$0")/../../.."
+
+ python tools/git-sync-deps
+ git clean -fxd platform_tools/android/apps/$APP
+ mkdir -p platform_tools/android/apps/${APP}/src/main/assets
+ cp -a resources platform_tools/android/apps/${APP}/src/main/assets/
+
+ for ARCH in arm arm64 x86 x64; do
+ BUILD=out/${APP}-$ARCH
+ mkdir -p "$BUILD"
+ make_gn > "${BUILD}/args.gn"
+ bin/gn gen $BUILD
+ ninja -C $BUILD $LIB
+ case $ARCH in
+ arm) NATIVE=armeabi-v7a ;;
+ arm64) NATIVE=arm64-v8a ;;
+ x86) NATIVE=x86 ;;
+ x64) NATIVE=x86_64 ;;
+ *) usage ;;
+ esac
+ DST=platform_tools/android/apps/$APP/src/main/libs/$NATIVE
+ mkdir -p $DST
+ cp -a $BUILD/$LIB $DST/$LIB
+ done
+ (
+ cd platform_tools/android
+ apps/gradlew --daemon -p apps/$APP -P suppressNativeBuild :${APP}:assembleUniversalDebug
+ )
+
+ mkdir -p out/${APP}-universal
+ cp platform_tools/android/apps/$APP/build/outputs/apk/${APP}-universal-debug.apk \
+ out/${APP}-universal/$APP-universal-debug.apk
+ ls -l out/${APP}-universal/$APP-universal-debug.apk
+}
+
+usage() {
+ cat >&2 <<EOM
+The environment variables ANDROID_NDK and ANDROID_HOME must be set to the
+locations of the Android NDK and SDK. Current values:
+
+ ANDROID_NDK="$ANDROID_NDK"
+ ANDROID_HOME="$ANDROID_HOME"
+
+Additionally, \`python\` and \`ninja\` should be in your path.
+
+EOM
+ exit 1
+}
+
+[ -d "$ANDROID_NDK" ] || usage
+[ -d "$ANDROID_HOME" ] || usage
+command -v ninja > /dev/null || usage
+command -v python > /dev/null || usage
+
+set -x # Verbose
+set -e # Exit immediately
+
+main viewer libviewer.so
diff --git a/tools/sk_app/android/surface_glue_android.cpp b/tools/sk_app/android/surface_glue_android.cpp
index 9c734247db..9766d3a56d 100644
--- a/tools/sk_app/android/surface_glue_android.cpp
+++ b/tools/sk_app/android/surface_glue_android.cpp
@@ -13,18 +13,44 @@
#include <unistd.h>
#include <unordered_map>
+#include <android/asset_manager.h>
+#include <android/asset_manager_jni.h>
#include <android/input.h>
#include <android/keycodes.h>
#include <android/looper.h>
#include <android/native_window_jni.h>
#include "../Application.h"
+#include "ResourceFactory.h"
#include "SkTypes.h"
#include "SkUtils.h"
#include "Window_android.h"
+
namespace sk_app {
+static void config_resource_mgr(JNIEnv* env, jobject assetManager) {
+ static AAssetManager* gAAssetManager = nullptr;
+ SkASSERT(assetManager);
+ gAAssetManager = AAssetManager_fromJava(env, assetManager);
+ SkASSERT(gAAssetManager);
+ gResourceFactory = [](const char* resource) -> sk_sp<SkData> {
+ if (!gAAssetManager) {
+ return nullptr;
+ }
+ SkString path = SkStringPrintf("resources/%s", resource);
+ AAsset* asset = AAssetManager_open(gAAssetManager, path.c_str(), AASSET_MODE_STREAMING);
+ if (!asset) {
+ return nullptr;
+ }
+ size_t size = SkToSizeT(AAsset_getLength(asset));
+ sk_sp<SkData> data = SkData::MakeUninitialized(size);
+ (void)AAsset_read(asset, data->writable_data(), size);
+ AAsset_close(asset);
+ return data;
+ };
+}
+
static const int LOOPER_ID_MESSAGEPIPE = 1;
static const std::unordered_map<int, Window::Key> ANDROID_TO_WINDOW_KEYMAP({
@@ -208,7 +234,10 @@ void* SkiaAndroidApp::pthread_main(void* arg) {
extern "C" // extern "C" is needed for JNI (although the method itself is in C++)
JNIEXPORT jlong JNICALL
- Java_org_skia_viewer_ViewerApplication_createNativeApp(JNIEnv* env, jobject application) {
+ Java_org_skia_viewer_ViewerApplication_createNativeApp(JNIEnv* env,
+ jobject application,
+ jobject assetManager) {
+ config_resource_mgr(env, assetManager);
SkiaAndroidApp* skiaAndroidApp = new SkiaAndroidApp(env, application);
return (jlong)((size_t)skiaAndroidApp);
}