{{{block.code}}}
}
"""
+
+ mmodule.callbacks_used_from_java.join m.foreign_callbacks
end
redef fun compile_extern_class(block, m, ccu, mmodule) do end
mmodule.insert_compiler_options
# Enable linking C callbacks to java native methods
- mmodule.ensure_linking_callback_methods(ffi_ccu.as(not null), mmodule.ffi_callbacks[self])
+ mmodule.ensure_linking_callback_methods(ffi_ccu.as(not null))
# Java implementation code
var java_file = mmodule.java_file
end
redef class MModule
+ private var callbacks_used_from_java = new ForeignCallbackSet
# Pure java class source file
private var java_file: nullable JavaClassTemplate = null
end
# Compile C code to call JNI and link C callbacks implementations to Java extern methods
- private fun ensure_linking_callback_methods(ccu: CCompilationUnit, callbacks: Set[NitniCallback])
+ private fun ensure_linking_callback_methods(ccu: CCompilationUnit)
do
+ var callbacks = callbacks_used_from_java.callbacks
if callbacks.is_empty then
ccu.body_decl.add "static int nit_ffi_with_java_registered_natives = 1;\n"
return
jni_methods.add_all(cb.jni_methods_declaration(self))
end
- var cf = new CFunction("static void nit_ffi_with_java_register_natives(JNIEnv* env, jclass jclazz)")
+ var cf = new CFunction("void nit_ffi_with_java_register_natives(JNIEnv* env, jclass jclazz)")
cf.exprs.add """
nit_ffi_with_java_registered_natives = 1;
# Tell the C compiler where to find jni.h and how to link with libjvm
private fun insert_compiler_options
do
- c_compiler_options = "{c_compiler_options} -I $(JAVA_HOME)/include/"
+ c_compiler_options = "{c_compiler_options} -I $(JAVA_HOME)/include/ -I $(JAVA_HOME)/include/linux/"
c_linker_options = "{c_linker_options} -L $(JNI_LIB_PATH) -ljvm"
end
super Template
var java_class_name: String
- init(name: String) do self.java_class_name = name
var header = new Template
var class_content = new Template
super ForeignType
var java_type: String
- init (java_type: String) do self.java_type = java_type
end
redef class NitniCallback
redef class MExplicitCall
redef fun compile_callback_to_java(mmodule, mainmodule, ccu)
do
+ if not mmodule.callbacks_used_from_java.callbacks.has(self) then return
+
var mproperty = mproperty
assert mproperty isa MMethod