X-Git-Url: http://nitlanguage.org diff --git a/lib/android/dalvik.nit b/lib/android/dalvik.nit index dc335dc..4777838 100644 --- a/lib/android/dalvik.nit +++ b/lib/android/dalvik.nit @@ -20,15 +20,17 @@ module dalvik import activities redef class App - # The main Java Activity of this application + # Main Java Activity of this application + # + # Require: A Nit activity is currently running. fun native_activity: NativeActivity is abstract -end -extern class JavaClassLoader in "Java" `{java.lang.ClassLoader`} - super JavaObject + # Current reference context, either an activity or a service + fun native_context: NativeContext do return native_activity end redef class Sys + # We cannot create a JVM on Android # # This method is not reachable on this platform anyway. @@ -38,12 +40,14 @@ redef class Sys redef fun jni_env do return jvm.attach_current_thread private var class_loader: nullable JavaObject = null + private var class_loader_method: nullable JMethodID = null + redef fun load_jclass(name) do var class_loader = self.class_loader if class_loader == null then - find_class_loader app.native_activity + find_class_loader app.native_context class_loader = self.class_loader assert class_loader != null end @@ -54,35 +58,35 @@ redef class Sys return load_jclass_intern(class_loader, class_loader_method, name) end - private fun find_class_loader(native_activity: NativeActivity) import jni_env, class_loader=, JavaObject.as nullable, class_loader_method=, JMethodID.as nullable `{ + private fun find_class_loader(native_context: NativeContext) import jni_env, class_loader=, JavaObject.as nullable, class_loader_method=, JMethodID.as nullable `{ JNIEnv *env = Sys_jni_env(self); // Retrieve main activity - jclass class_activity = (*env)->GetObjectClass(env, native_activity); - if (class_activity == NULL) { - __android_log_print(ANDROID_LOG_ERROR, "Nit", "Failed retrieving activity class"); + jclass class_context = (*env)->GetObjectClass(env, native_context); + if (class_context == NULL) { + __android_log_print(ANDROID_LOG_ERROR, "Nit", "Failed to retrieve activity class"); (*env)->ExceptionDescribe(env); exit(1); } - jmethodID class_activity_getClassLoader = (*env)->GetMethodID(env, class_activity, "getClassLoader", "()Ljava/lang/ClassLoader;"); + jmethodID class_activity_getClassLoader = (*env)->GetMethodID(env, class_context, "getClassLoader", "()Ljava/lang/ClassLoader;"); if (class_activity_getClassLoader == NULL) { - __android_log_print(ANDROID_LOG_ERROR, "Nit", "Failed retrieving 'getClassLoader' method"); + __android_log_print(ANDROID_LOG_ERROR, "Nit", "Failed to retrieve 'getClassLoader' method"); (*env)->ExceptionDescribe(env); exit(1); } // Call activity.getClassLoader - jobject instance_class_loader = (*env)->CallObjectMethod(env, native_activity, class_activity_getClassLoader); + jobject instance_class_loader = (*env)->CallObjectMethod(env, native_context, class_activity_getClassLoader); if (instance_class_loader == NULL) { - __android_log_print(ANDROID_LOG_ERROR, "Nit", "Failed retrieving class loader instance"); + __android_log_print(ANDROID_LOG_ERROR, "Nit", "Failed to retrieve class loader instance"); (*env)->ExceptionDescribe(env); exit(1); } jclass class_class_loader = (*env)->GetObjectClass(env, instance_class_loader); if (class_class_loader == NULL) { - __android_log_print(ANDROID_LOG_ERROR, "Nit", "Failed retrieving class of class loader"); + __android_log_print(ANDROID_LOG_ERROR, "Nit", "Failed to retrieve class of class loader"); (*env)->ExceptionDescribe(env); exit(1); } @@ -90,7 +94,7 @@ redef class Sys // Get the method ClassLoader.findClass jmethodID class_class_loader_findClass = (*env)->GetMethodID(env, class_class_loader, "findClass", "(Ljava/lang/String;)Ljava/lang/Class;"); if (class_class_loader_findClass == NULL) { - __android_log_print(ANDROID_LOG_ERROR, "Nit", "Failed retrieving 'findClass' method"); + __android_log_print(ANDROID_LOG_ERROR, "Nit", "Failed to retrieve 'findClass' method"); (*env)->ExceptionDescribe(env); exit(1); } @@ -100,12 +104,12 @@ redef class Sys Sys_class_loader_method__assign(self, JMethodID_as_nullable(class_class_loader_findClass)); // Clean up - (*env)->DeleteLocalRef(env, class_activity); + (*env)->DeleteLocalRef(env, class_context); (*env)->DeleteLocalRef(env, instance_class_loader); (*env)->DeleteLocalRef(env, class_class_loader); `} - private fun load_jclass_intern(instance_class_loader: JavaObject, class_loader_findClass: JMethodID, name: NativeString): JClass import jni_env `{ + private fun load_jclass_intern(instance_class_loader: JavaObject, class_loader_findClass: JMethodID, name: CString): JClass import jni_env `{ JNIEnv *env = Sys_jni_env(self); jobject class_name = (*env)->NewStringUTF(env, name);