# Compile C and Java code to implement this callback
fun compile_callback_to_java(mmodule: MModule, mainmodule: MModule, ccu: CCompilationUnit) do end
src/ffi/java.nit:501,2--502,98
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
# In C, indirection implementing the Java extern methods
var csignature = mproperty.build_c_implementation_signature(recv_mtype, mmodule, "___indirect", long_signature, from_java_call_context)
var cf = new CFunction("JNIEXPORT {csignature}")
cf.exprs.add "\t{mproperty.build_ccall(recv_mtype, mainmodule, null, long_signature, from_java_call_context, null)}\n"
ccu.add_non_static_local_function cf
# In Java, declare the extern method as a private static local method
var java_signature = mproperty.build_csignature(recv_mtype, mainmodule, null, short_signature, java_call_context)
mmodule.java_file.class_content.add "private native static {java_signature};\n"
end
src/ffi/java.nit:514,2--530,4
redef fun compile_callback_to_java(mmodule, mainmodule, ccu)
do
if self isa MClassType and mclass.ftype isa ForeignJavaType then return
var java_file = mmodule.java_file
if java_file == null or mmodule.callbacks_used_from_java.callbacks.is_empty then return
for variation in ["incr", "decr"] do
var friendly_name = "{mangled_cname}_{variation}_ref"
# C
var csignature = "void {mmodule.impl_java_class_name}_{friendly_name}(JNIEnv *nit_ffi_jni_env, jclass clazz, jobject object)"
var cf = new CFunction("JNIEXPORT {csignature}")
cf.exprs.add "\tnitni_global_ref_{variation}(nit_ffi_with_java_nit_object_data(nit_ffi_jni_env, object));"
ccu.add_non_static_local_function cf
# Java
java_file.class_content.add "private native static void {friendly_name}(nit.app.NitObject object);\n"
end
end
src/ffi/java.nit:575,2--594,4
redef fun compile_callback_to_java(mmodule, mainmodule, ccu)
do
# Don't generate functions for reference counters on extern classes
if mclass.ftype != null then return
super
end
src/ffi/java.nit:739,2--745,4