Index: tools/viewer/sk_app/android/surface_glue_android.cpp |
diff --git a/tools/viewer/sk_app/android/surface_glue_android.cpp b/tools/viewer/sk_app/android/surface_glue_android.cpp |
index 958b7876b8baa674aec32cc89c684d8f7db0edda..60897f4635947fcb0d022b20e2b3a2f84b40ec7f 100644 |
--- a/tools/viewer/sk_app/android/surface_glue_android.cpp |
+++ b/tools/viewer/sk_app/android/surface_glue_android.cpp |
@@ -21,6 +21,7 @@ |
#include "../Application.h" |
#include "SkTypes.h" |
#include "SkUtils.h" |
+#include "SkString.h" |
#include "Window_android.h" |
namespace sk_app { |
@@ -46,6 +47,7 @@ SkiaAndroidApp::SkiaAndroidApp(JNIEnv* env, jobject androidApp) { |
fAndroidApp = env->NewGlobalRef(androidApp); |
jclass cls = env->GetObjectClass(fAndroidApp); |
fSetTitleMethodID = env->GetMethodID(cls, "setTitle", "(Ljava/lang/String;)V"); |
+ fUpdateStateMethodID = env->GetMethodID(cls, "updateState", "(Ljava/lang/String;)V"); |
fNativeWindow = nullptr; |
pthread_create(&fThread, nullptr, pthread_main, this); |
} |
@@ -70,6 +72,12 @@ void SkiaAndroidApp::setTitle(const char* title) const { |
fPThreadEnv->DeleteLocalRef(titleString); |
} |
+void SkiaAndroidApp::updateState(const char* stateJsonStr) const { |
+ jstring jstr = fPThreadEnv->NewStringUTF(stateJsonStr); |
+ fPThreadEnv->CallVoidMethod(fAndroidApp, fUpdateStateMethodID, jstr); |
+ fPThreadEnv->DeleteLocalRef(jstr); |
+} |
+ |
void SkiaAndroidApp::postMessage(const Message& message) const { |
SkDEBUGCODE(auto writeSize =) write(fPipes[1], &message, sizeof(message)); |
SkASSERT(writeSize == sizeof(message)); |
@@ -139,6 +147,12 @@ int SkiaAndroidApp::message_callback(int fd, int events, void* data) { |
message.fTouchY); |
break; |
} |
+ case kSetState: { |
+ skiaAndroidApp->fWindow->onSet(*message.stateName, *message.stateValue); |
+ delete message.stateName; |
+ delete message.stateValue; |
+ break; |
+ } |
default: { |
// do nothing |
} |
@@ -229,4 +243,17 @@ extern "C" JNIEXPORT void JNICALL Java_org_skia_viewer_ViewerActivity_onTouched( |
skiaAndroidApp->postMessage(message); |
} |
+extern "C" JNIEXPORT void JNICALL Java_org_skia_viewer_ViewerActivity_setState( |
+ JNIEnv* env, jobject activity, jlong handle, jstring stateName, jstring stateValue) { |
+ auto skiaAndroidApp = (SkiaAndroidApp*)handle; |
+ Message message(kSetState); |
+ const char* nameChars = env->GetStringUTFChars(stateName, nullptr); |
+ const char* valueChars = env->GetStringUTFChars(stateValue, nullptr); |
+ message.stateName = new SkString(nameChars); |
djsollen
2016/05/24 17:32:40
stateName.reset(nameChars);
liyuqian
2016/05/24 20:18:05
We'll preserve the pointers because of the message
|
+ message.stateValue = new SkString(valueChars); |
+ skiaAndroidApp->postMessage(message); |
+ env->ReleaseStringUTFChars(stateName, nameChars); |
+ env->ReleaseStringUTFChars(stateValue, valueChars); |
+} |
+ |
} // namespace sk_app |