friendz: use ai::backtrack instead of the ad-hoc solver
[nit.git] / lib / java.nit
index cd433ba..1f7755b 100644 (file)
@@ -29,6 +29,7 @@
 module java is
        c_compiler_option("-I $(JAVA_HOME)/include/")
        c_linker_option("-L $(JNI_LIB_PATH) -ljvm")
+       new_annotation extra_java_files
 end
 
 import jvm
@@ -49,7 +50,6 @@ redef class Sys
        fun jvm=(jvm: JavaVM) do jvm_cache = jvm
 
        # Current main `JniEnv`
-       # FIXME support threaded Java
        fun jni_env: JniEnv
        do
                if jni_env_cache == null then create_default_jvm
@@ -74,6 +74,21 @@ redef class Sys
                self.jvm = jvm
                self.jni_env = builder.jni_env.as(not null)
        end
+
+       # Get a Java class by its name from the current `jni_env`
+       fun load_jclass(name: NativeString): JClass import jni_env `{
+               JNIEnv *nit_ffi_jni_env = Sys_jni_env(recv);
+
+               // retreive the implementation Java class
+               jclass java_class = (*nit_ffi_jni_env)->FindClass(nit_ffi_jni_env, name);
+               if (java_class == NULL) {
+                       fprintf(stderr, "Nit FFI with Java error: failed to load class.\\n");
+                       (*nit_ffi_jni_env)->ExceptionDescribe(nit_ffi_jni_env);
+                       exit(1);
+               }
+
+               return java_class;
+       `}
 end
 
 # A standard Java string `java.lang.String`
@@ -142,4 +157,24 @@ redef extern class JavaObject
                JNIEnv *env = Sys_jni_env(sys);
                (*env)->DeleteGlobalRef(env, recv);
        `}
+
+       # Delete this local reference
+       fun delete_local_ref import sys, Sys.jni_env `{
+               Sys sys = JavaObject_sys(recv);
+               JNIEnv *env = Sys_jni_env(sys);
+               (*env)->DeleteLocalRef(env, recv);
+       `}
+
+       # Pops the current local reference frame and return a valid reference to self
+       #
+       # Similiar to `JavaVM::pop_local_frame` but returns a value.
+       fun pop_from_local_frame: SELF
+       do
+               var jni_env = sys.jni_env
+               return pop_from_local_frame_with_env(jni_env)
+       end
+       
+       private fun pop_from_local_frame_with_env(jni_env: JniEnv): SELF `{
+               return (*jni_env)->PopLocalFrame(jni_env, recv);
+       `}
 end