2
0
mirror of synced 2025-02-23 06:48:15 +00:00

app: make GoNativeActivity.getKey static

The input queue runs concurrent with the native activity lifecycle,
and so the getKey helper Java method might be called after the
app has been destroyed. This is particularly likely for "back"
key presses that destroys activities.

Change the getKey method to be static so that it can be called
outside the app lifecycle.

Run `go generate ./cmd/gomobile` to update the compiled dex file that
contains GoNativeActivity.

Fixes golang/go#27652

Change-Id: Id2c863ee07e5447f033e67d6948fbfe746916ffa
Reviewed-on: https://go-review.googlesource.com/135215
Reviewed-by: Hyang-Ah Hana Kim <hyangah@gmail.com>
This commit is contained in:
Elias Naur 2018-09-13 15:47:56 +02:00
parent 6c7f9eaa5c
commit 6d4b718bf3
4 changed files with 36 additions and 23 deletions

View File

@ -21,7 +21,7 @@ public class GoNativeActivity extends NativeActivity {
return getCacheDir().getAbsolutePath();
}
int getRune(int deviceId, int keyCode, int metaState) {
static int getRune(int deviceId, int keyCode, int metaState) {
try {
int rune = KeyCharacterMap.load(deviceId).get(keyCode, metaState);
if (rune == 0) {

View File

@ -15,7 +15,7 @@
#define LOG_INFO(...) __android_log_print(ANDROID_LOG_INFO, "Go", __VA_ARGS__)
#define LOG_FATAL(...) __android_log_print(ANDROID_LOG_FATAL, "Go", __VA_ARGS__)
static jobject current_ctx;
static jclass current_class;
static jclass find_class(JNIEnv *env, const char *class_name) {
jclass clazz = (*env)->FindClass(env, class_name);
@ -37,6 +37,16 @@ static jmethodID find_method(JNIEnv *env, jclass clazz, const char *name, const
return m;
}
static jmethodID find_static_method(JNIEnv *env, jclass clazz, const char *name, const char *sig) {
jmethodID m = (*env)->GetStaticMethodID(env, clazz, name, sig);
if (m == 0) {
(*env)->ExceptionClear(env);
LOG_FATAL("cannot find method %s %s", name, sig);
return 0;
}
return m;
}
static jmethodID key_rune_method;
jint JNI_OnLoad(JavaVM* vm, void* reserved) {
@ -63,16 +73,15 @@ void ANativeActivity_onCreate(ANativeActivity *activity, void* savedState, size_
JNIEnv* env = activity->env;
// Note that activity->clazz is mis-named.
current_ctx = activity->clazz;
current_class = (*env)->GetObjectClass(env, activity->clazz);
current_class = (*env)->NewGlobalRef(env, current_class);
key_rune_method = find_static_method(env, current_class, "getRune", "(III)I");
jclass clazz = (*env)->GetObjectClass(env, current_ctx);
key_rune_method = find_method(env, clazz, "getRune", "(III)I");
setCurrentContext(activity->vm, (*env)->NewGlobalRef(env, current_ctx));
setCurrentContext(activity->vm, (*env)->NewGlobalRef(env, activity->clazz));
// Set TMPDIR.
jmethodID gettmpdir = find_method(env, clazz, "getTmpdir", "()Ljava/lang/String;");
jstring jpath = (jstring)(*env)->CallObjectMethod(env, current_ctx, gettmpdir, NULL);
jmethodID gettmpdir = find_method(env, current_class, "getTmpdir", "()Ljava/lang/String;");
jstring jpath = (jstring)(*env)->CallObjectMethod(env, activity->clazz, gettmpdir, NULL);
const char* tmpdir = (*env)->GetStringUTFChars(env, jpath, NULL);
if (setenv("TMPDIR", tmpdir, 1) != 0) {
LOG_INFO("setenv(\"TMPDIR\", \"%s\", 1) failed: %d", tmpdir, errno);
@ -180,9 +189,9 @@ char* destroyEGLSurface() {
}
int32_t getKeyRune(JNIEnv* env, AInputEvent* e) {
return (int32_t)(*env)->CallIntMethod(
return (int32_t)(*env)->CallStaticIntMethod(
env,
current_ctx,
current_class,
key_rune_method,
AInputEvent_getDeviceId(e),
AKeyEvent_getKeyCode(e),

View File

@ -6,7 +6,7 @@
package main
var dexStr = `ZGV4CjAzNQDLd99M/fS0PS92C6RiRJwxvmoe+xpwV/GQCAAAcAAAAHhWNBIAAAAAAAAAAP` +
var dexStr = `ZGV4CjAzNQAoeJK42wHKtxuGg5UGeZAqfLMlHcB49+eQCAAAcAAAAHhWNBIAAAAAAAAAAP` +
`AHAAAxAAAAcAAAABEAAAA0AQAADwAAAHgBAAACAAAALAIAABMAAAA8AgAAAQAAANQCAACc` +
`BQAA9AIAAHIEAAB6BAAAfgQAAJUEAACYBAAAnQQAAKMEAACoBAAArgQAALEEAAC1BAAAuQ` +
`QAAL4EAADcBAAA/QQAABcFAAA6BQAAXwUAAHQFAACIBQAAvQUAAN0FAADtBQAABAYAABgG` +
@ -20,12 +20,12 @@ var dexStr = `ZGV4CjAzNQDLd99M/fS0PS92C6RiRJwxvmoe+xpwV/GQCAAAcAAAAHhWNBIAAAAAAA
`AAAAEADQAwAAAAAwAEACQAAAAFAAYAIgAAAAYACwAoAAAABwACAB4AAAAHAAMAHgAAAAkA` +
`AAAgAAAACQAIACsAAAAKAAoAIQAAAA0ADgAsAAAADwAMAAAAAAAPAAkAIwAAAA8ABQAlAA` +
`AADwAHACYAAAAPAAEAJwAAAA8ACgApAAAADwAMACsAAAAPAA0AMAAAAA8AAAABAAAAAQAA` +
`AAAAAAACAAAAAAAAANIHAAAAAAAAAQABAAEAAACeBwAABgAAAHAQAAAAAGkAAQAOAAQAAQ` +
`ADAAEApQcAADMAAABuEA4AAwAMAG4QDQADAAwBbhACAAEADAETAoAAbjADABACDABUAQAA` +
`OQEKABoAAQAaAS4AcSAFABAADgBUAAAAGgEdAG4gBAAQAAwAcRAKAAAAKPQNABoBAQAaAi` +
`0AcTAGACEAKOsAAAAAAAApAAEAAQELKggABAADAAEAtQcAABkAAAAS8HEQCAAFAAwBbjAH` +
`AGEHCgE5AQMADwABECj+DQEaAgEAGgMfAHEwBgAyASj1DQEo8wAAAQAAAAcAAQABAggXCw` +
`4AAAIAAQABAAAAxQcAAAkAAABuEAwAAQAMAG4QCQAAAAwAEQAAAAIAAgACAAAAygcAAAcA` +
`AAAAAAACAAAAAAAAANIHAAAAAAAAAQABAAEAAACeBwAABgAAAHAQAAAAAGkAAQAOAAcAAw` +
`ADAAEApQcAABkAAAAS8HEQCAAEAAwBbjAHAFEGCgE5AQMADwABECj+DQEaAgEAGgMfAHEw` +
`BgAyASj1DQEo8wAAAQAAAAcAAQABAggXCw4AAAQAAQADAAEAtQcAADMAAABuEA4AAwAMAG` +
`4QDQADAAwBbhACAAEADAETAoAAbjADABACDABUAQAAOQEKABoAAQAaAS4AcSAFABAADgBU` +
`AAAAGgEdAG4gBAAQAAwAcRAKAAAAKPQNABoBAQAaAi0AcTAGACEAKOsAAAAAAAApAAEAAQ` +
`ELKgIAAQABAAAAxQcAAAkAAABuEAwAAQAMAG4QCQAAAAwAEQAAAAIAAgACAAAAygcAAAcA` +
`AABwEBEAAABvIAEAEAAOAAAAAgAAAAAAAAADAAAAAAAAAAAAAAACAAAADAAMAAMAAAAMAA` +
`wADgAAAAIAAAACAAAAAQAAAAAAAAABAAAADAAAAAEAAAAGAAY8aW5pdD4AAkdvABVHb05h` +
`dGl2ZUFjdGl2aXR5LmphdmEAAUkAA0lJSQAESUlJSQADSUxMAARJTExMAAFMAAJMSQACTE` +
@ -43,8 +43,8 @@ var dexStr = `ZGV4CjAzNQDLd99M/fS0PS92C6RiRJwxvmoe+xpwV/GQCAAAcAAAAHhWNBIAAAAAAA
`dFBhY2thZ2VNYW5hZ2VyAAdnZXRSdW5lAAlnZXRTdHJpbmcACWdldFRtcGRpcgAQZ29OYX` +
`RpdmVBY3Rpdml0eQAEbG9hZAALbG9hZExpYnJhcnkAEmxvYWRMaWJyYXJ5IGZhaWxlZAAn` +
`bG9hZExpYnJhcnk6IG5vIG1hbmlmZXN0IG1ldGFkYXRhIGZvdW5kAAhtZXRhRGF0YQAIb2` +
`5DcmVhdGUAEAAHDjwtADEABw5Lo0xLfwJ7HYdLHgAaAwAAAAcdhzQCeywgHoMAFQAHDgBA` +
`AQAHDjw8AAEAAgMBCguBgAT0BQYCkAYPAJQHAQDoBwIBjAgAAA0AAAAAAAAAAQAAAAAAAA` +
`5DcmVhdGUAEAAHDjwtABoDAAAABx2HNAJ7LCAegwAxAAcOS6NMS38Cex2HSx4AFQAHDgBA` +
`AQAHDjw8AAEAAwIBCguBgAT0BQQIkAYCAuQGEADoBwIBjAgAAA0AAAAAAAAAAQAAAAAAAA` +
`ABAAAAMQAAAHAAAAACAAAAEQAAADQBAAADAAAADwAAAHgBAAAEAAAAAgAAACwCAAAFAAAA` +
`EwAAADwCAAAGAAAAAQAAANQCAAABIAAABQAAAPQCAAABEAAACAAAACwEAAACIAAAMQAAAH` +
`IEAAADIAAABQAAAJ4HAAAAIAAAAQAAANIHAAAAEAAAAQAAAPAHAAA=` +

View File

@ -24,7 +24,7 @@ Commands:
bind build a library for Android and iOS
build compile android APK and iOS app
clean remove object files and cached gomobile files
init build OpenAL for Android
init install NDK toolchains and build OpenAL for Android
install compile android APK and install on device
version print version
@ -124,11 +124,15 @@ Usage:
Clean removes object files and cached NDK files downloaded by gomobile init
Build OpenAL for Android
Install NDK toolchains and build OpenAL for Android
Usage:
gomobile init -openal dir
gomobile init [-ndk dir] [-openal dir]
If the -ndk flag is specified or the Android NDK is installed at
$ANDROID_HOME/ndk-bundle, init will create NDK standalone toolchains
for Android targets.
If a OpenAL source directory is specified with -openal, init will
build an Android version of OpenAL for use with gomobile build