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 acee839a30edfca2318eb534a84c5a7ea46eacad..c9e19104c902d3b6d833581d42fc24ad6a9e3435 100644 |
--- a/tools/viewer/sk_app/android/surface_glue_android.cpp |
+++ b/tools/viewer/sk_app/android/surface_glue_android.cpp |
@@ -31,14 +31,15 @@ static const std::unordered_map<int, Window::Key> ANDROID_TO_WINDOW_KEYMAP({ |
{AKEYCODE_SOFT_RIGHT, Window::Key::kRight} |
}); |
-void* pthread_main(void* arg); |
- |
-SkiaAndroidApp::SkiaAndroidApp() { |
+SkiaAndroidApp::SkiaAndroidApp(JNIEnv* env, jobject androidApp) { |
+ env->GetJavaVM(&fJavaVM); |
+ fAndroidApp = env->NewGlobalRef(androidApp); |
fNativeWindow = nullptr; |
pthread_create(&fThread, nullptr, pthread_main, this); |
} |
SkiaAndroidApp::~SkiaAndroidApp() { |
+ fPThreadEnv->DeleteGlobalRef(fAndroidApp); |
if (fWindow) { |
fWindow->detach(); |
} |
@@ -51,23 +52,29 @@ SkiaAndroidApp::~SkiaAndroidApp() { |
} |
} |
+void SkiaAndroidApp::setAndroidTitle(const char* title) const { |
+ jclass cls = fPThreadEnv->GetObjectClass(fAndroidApp); |
+ jmethodID methodID = fPThreadEnv->GetMethodID(cls, "setTitle", "(Ljava/lang/String;)V"); |
+ fPThreadEnv->CallVoidMethod(fAndroidApp, methodID, fPThreadEnv->NewStringUTF(title)); |
+} |
+ |
void SkiaAndroidApp::paintIfNeeded() { |
if (fNativeWindow && fWindow) { |
fWindow->onPaint(); |
} |
} |
-void SkiaAndroidApp::postMessage(const Message& message) { |
+void SkiaAndroidApp::postMessage(const Message& message) const { |
auto writeSize = write(fPipes[1], &message, sizeof(message)); |
SkASSERT(writeSize == sizeof(message)); |
} |
-void SkiaAndroidApp::readMessage(Message* message) { |
+void SkiaAndroidApp::readMessage(Message* message) const { |
auto readSize = read(fPipes[0], message, sizeof(Message)); |
SkASSERT(readSize == sizeof(Message)); |
} |
-static int message_callback(int fd, int events, void* data) { |
+int SkiaAndroidApp::message_callback(int fd, int events, void* data) { |
auto skiaAndroidApp = (SkiaAndroidApp*)data; |
Message message; |
skiaAndroidApp->readMessage(&message); |
@@ -127,10 +134,11 @@ static int message_callback(int fd, int events, void* data) { |
return 1; // continue receiving callbacks |
} |
-void* pthread_main(void* arg) { |
+void* SkiaAndroidApp::pthread_main(void* arg) { |
SkDebugf("pthread_main begins"); |
auto skiaAndroidApp = (SkiaAndroidApp*)arg; |
+ skiaAndroidApp->fJavaVM->AttachCurrentThread(&(skiaAndroidApp->fPThreadEnv), nullptr); |
djsollen
2016/05/13 14:56:27
can you add some comments on why we need to attach
liyuqian
2016/05/13 15:18:41
Done.
|
ALooper* looper = ALooper_prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS); |
pipe(skiaAndroidApp->fPipes); |
@@ -152,13 +160,13 @@ void* 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 activity) { |
- SkiaAndroidApp* skiaAndroidApp = new SkiaAndroidApp; |
+ Java_org_skia_viewer_ViewerApplication_createNativeApp(JNIEnv* env, jobject application) { |
+ SkiaAndroidApp* skiaAndroidApp = new SkiaAndroidApp(env, application); |
return (jlong)((size_t)skiaAndroidApp); |
} |
extern "C" JNIEXPORT void JNICALL Java_org_skia_viewer_ViewerApplication_destroyNativeApp( |
- JNIEnv* env, jobject activity, jlong handle) { |
+ JNIEnv* env, jobject application, jlong handle) { |
auto skiaAndroidApp = (SkiaAndroidApp*)handle; |
skiaAndroidApp->postMessage(Message(kDestroyApp)); |
} |