lib/android: intro `app::native_context` and use in `dalvik`
authorAlexis Laferrière <alexis.laf@xymus.net>
Fri, 11 Mar 2016 18:50:47 +0000 (13:50 -0500)
committerAlexis Laferrière <alexis.laf@xymus.net>
Sun, 13 Mar 2016 13:50:13 +0000 (09:50 -0400)
Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

lib/android/dalvik.nit

index dc335dc..486d140 100644 (file)
@@ -20,8 +20,13 @@ 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
+
+       # Current reference context, either an activity or a service
+       fun native_context: NativeContext do return native_activity
 end
 
 extern class JavaClassLoader in "Java" `{java.lang.ClassLoader`}
@@ -43,7 +48,7 @@ redef class Sys
        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 +59,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 +95,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,7 +105,7 @@ 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);
        `}