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.
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
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);
}
// 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);
}
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);