# Java related services specific to Android and its Dalvik VM
module dalvik
-import native_app_glue
+import activities
+
+redef class App
+ # The main Java Activity of this application
+ fun native_activity: NativeActivity is abstract
+end
extern class JavaClassLoader in "Java" `{java.lang.ClassLoader`}
super JavaObject
end
redef class Sys
- # Get the running JVM
- redef fun create_default_jvm
- do
- var jvm = app.native_app_glue.ndk_native_activity.vm
- var jni_env = jvm.attach_current_thread
- if jni_env.address_is_null then jni_env = jvm.env
+ # We cannot create a JVM on Android
+ #
+ # This method is not reachable on this platform anyway.
+ # `Sys::jvm` is implemented by the main activity modules.
+ redef fun create_default_jvm do abort
- self.jvm = jvm
- self.jni_env = jni_env
- end
+ 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
do
var class_loader = self.class_loader
if class_loader == null then
- find_class_loader(app.native_app_glue.ndk_native_activity.java_native_activity)
+ find_class_loader app.native_activity
class_loader = self.class_loader
assert class_loader != null
end
// Retrieve main activity
jclass class_activity = (*env)->GetObjectClass(env, native_activity);
if (class_activity == NULL) {
- __android_log_print(ANDROID_LOG_ERROR, "Nit", "retreiving activity class");
+ __android_log_print(ANDROID_LOG_ERROR, "Nit", "Failed retrieving activity class");
(*env)->ExceptionDescribe(env);
exit(1);
}
jmethodID class_activity_getClassLoader = (*env)->GetMethodID(env, class_activity, "getClassLoader", "()Ljava/lang/ClassLoader;");
if (class_activity_getClassLoader == NULL) {
- __android_log_print(ANDROID_LOG_ERROR, "Nit", "retreiving 'getClassLoader' method");
+ __android_log_print(ANDROID_LOG_ERROR, "Nit", "Failed retrieving 'getClassLoader' method");
(*env)->ExceptionDescribe(env);
exit(1);
}
// Call activity.getClassLoader
jobject instance_class_loader = (*env)->CallObjectMethod(env, native_activity, class_activity_getClassLoader);
if (instance_class_loader == NULL) {
- __android_log_print(ANDROID_LOG_ERROR, "Nit", "retreiving class loader instance");
+ __android_log_print(ANDROID_LOG_ERROR, "Nit", "Failed retrieving 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", "retreiving class of class loader");
+ __android_log_print(ANDROID_LOG_ERROR, "Nit", "Failed retrieving 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", "retreiving 'findClass' method");
+ __android_log_print(ANDROID_LOG_ERROR, "Nit", "Failed retrieving 'findClass' method");
(*env)->ExceptionDescribe(env);
exit(1);
}
jclass java_class = (*env)->CallObjectMethod(env, instance_class_loader, class_loader_findClass, class_name);
if (java_class == NULL) {
- __android_log_print(ANDROID_LOG_ERROR, "Nit", "loading targetted class");
+ __android_log_print(ANDROID_LOG_ERROR, "Nit", "Failed loading targeted class");
(*env)->ExceptionDescribe(env);
exit(1);
}