bind: handle ClassNotFoundExceptions on older Androids

If a wrapped Java class is missing at runtime, for example because
the app is running on an older Android version, the resulting class
not found exception would cause the app to crash. Fix it by ignoring
missing classes, allowing the app to avoid using them according to a
runtime version check.

Change-Id: I9138c4e2a905b180959306ecbb997695236ab273
Reviewed-on: https://go-review.googlesource.com/35853
Reviewed-by: David Crawshaw <crawshaw@golang.org>
This commit is contained in:
Elias Naur
2017-01-31 20:25:05 +00:00
parent 959f80f9a9
commit ab9391cb88
3 changed files with 156 additions and 100 deletions
+29 -17
View File
@@ -19,23 +19,35 @@ static jmethodID m_java_lang_Character_Subset_toString;
void init_proxies() {
JNIEnv *env = go_seq_push_local_frame(6);
jclass clazz;
clazz = (*env)->FindClass(env, "java/lang/Float");
class_java_lang_Float = (*env)->NewGlobalRef(env, clazz);
m_java_lang_Float_toString = go_seq_get_method_id(clazz, "toString", "()Ljava/lang/String;");
clazz = (*env)->FindClass(env, "java/lang/Long");
class_java_lang_Long = (*env)->NewGlobalRef(env, clazz);
m_java_lang_Long_toString = go_seq_get_method_id(clazz, "toString", "()Ljava/lang/String;");
clazz = (*env)->FindClass(env, "java/lang/Object");
class_java_lang_Object = (*env)->NewGlobalRef(env, clazz);
m_java_lang_Object_toString = go_seq_get_method_id(clazz, "toString", "()Ljava/lang/String;");
clazz = (*env)->FindClass(env, "java/lang/Runnable");
class_java_lang_Runnable = (*env)->NewGlobalRef(env, clazz);
clazz = (*env)->FindClass(env, "java/lang/Character");
class_java_lang_Character = (*env)->NewGlobalRef(env, clazz);
m_java_lang_Character_toString = go_seq_get_method_id(clazz, "toString", "()Ljava/lang/String;");
clazz = (*env)->FindClass(env, "java/lang/Character$Subset");
class_java_lang_Character_Subset = (*env)->NewGlobalRef(env, clazz);
m_java_lang_Character_Subset_toString = go_seq_get_method_id(clazz, "toString", "()Ljava/lang/String;");
clazz = go_seq_find_class("java/lang/Float");
if (clazz != NULL) {
class_java_lang_Float = (*env)->NewGlobalRef(env, clazz);
m_java_lang_Float_toString = go_seq_get_method_id(clazz, "toString", "()Ljava/lang/String;");
}
clazz = go_seq_find_class("java/lang/Long");
if (clazz != NULL) {
class_java_lang_Long = (*env)->NewGlobalRef(env, clazz);
m_java_lang_Long_toString = go_seq_get_method_id(clazz, "toString", "()Ljava/lang/String;");
}
clazz = go_seq_find_class("java/lang/Object");
if (clazz != NULL) {
class_java_lang_Object = (*env)->NewGlobalRef(env, clazz);
m_java_lang_Object_toString = go_seq_get_method_id(clazz, "toString", "()Ljava/lang/String;");
}
clazz = go_seq_find_class("java/lang/Runnable");
if (clazz != NULL) {
class_java_lang_Runnable = (*env)->NewGlobalRef(env, clazz);
}
clazz = go_seq_find_class("java/lang/Character");
if (clazz != NULL) {
class_java_lang_Character = (*env)->NewGlobalRef(env, clazz);
m_java_lang_Character_toString = go_seq_get_method_id(clazz, "toString", "()Ljava/lang/String;");
}
clazz = go_seq_find_class("java/lang/Character$Subset");
if (clazz != NULL) {
class_java_lang_Character_Subset = (*env)->NewGlobalRef(env, clazz);
m_java_lang_Character_Subset_toString = go_seq_get_method_id(clazz, "toString", "()Ljava/lang/String;");
}
go_seq_pop_local_frame(env);
}