contrib/jwrapper: generate JNI services for each extern class
authorAlexis Laferrière <alexis.laf@xymus.net>
Wed, 29 Jul 2015 12:47:00 +0000 (08:47 -0400)
committerAlexis Laferrière <alexis.laf@xymus.net>
Wed, 29 Jul 2015 19:05:13 +0000 (15:05 -0400)
Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

contrib/jwrapper/src/code_generator.nit

index 1a71ba4..cba7c49 100644 (file)
@@ -90,6 +90,9 @@ class CodeGenerator
                                generate_getter_setter(jclass, id, attribute)
                        end
 
+                       # JNI services
+                       generate_jni_services jclass.class_type
+
                        # Close the class
                        file_out.write "end\n\n"
 
@@ -316,10 +319,34 @@ extern class {{{nit_type}}} in "Java" `{ {{{java_type.extern_equivalent}}} `}
        redef fun []=(i, e) in "Java" `{ self[(int)i] = e; `}
 
        redef fun length in "Java" `{ return self.length; `}
+
+"""
+               generate_jni_services(java_type)
+               file_out.write """
 end
 
 """
        end
+
+       # Generate JNI related services
+       #
+       # For now, mostly avoid issue #845, but more services could be generated as needed.
+       private fun generate_jni_services(java_type: JavaType)
+       do
+               var nit_type = model.java_to_nit_type(java_type)
+
+               file_out.write """
+       redef fun new_global_ref import sys, Sys.jni_env `{
+               Sys sys = {{{nit_type}}}_sys(self);
+               JNIEnv *env = Sys_jni_env(sys);
+               return (*env)->NewGlobalRef(env, self);
+       `}
+
+       redef fun pop_from_local_frame_with_env(jni_env) `{
+               return (*jni_env)->PopLocalFrame(jni_env, self);
+       `}
+"""
+       end
 end
 
 redef class Sys