# to wrap foreign code in Nit methods.
module common_ffi
-import parser
import modelbuilder
import nitni
-import ffi_base
+intrude import ffi_base
import extern_classes
import header_dependency
import pkgconfig
import c
import cpp
import java
+import extra_java_files
redef class MModule
# Does this module uses the FFI?
ffi_ccu.write_as_impl(self, compdir)
for filename in ffi_ccu.files do ffi_files.add(new ExternCFile(filename, c_compiler_options))
end
+
+ # Avoid the compile a ffi propdef more than once
+ # See `AMethPropdef::compile_ffi_method`
+ # FIXME find a better way
+ private var compiled_ffi_methods = new HashSet[AMethPropdef]
end
redef class AModule
ffi_ccu.header_c_base.add( "#include \"{mmodule.name}._nitni.h\"\n" )
+ ffi_ccu.body_decl.add("#ifdef ANDROID\n")
+ ffi_ccu.body_decl.add(" #include <android/log.h>\n")
+ ffi_ccu.body_decl.add(" #define PRINT_ERROR(...) (void)__android_log_print(ANDROID_LOG_WARN, \"Nit\", __VA_ARGS__)\n")
+ ffi_ccu.body_decl.add("#else\n")
+ ffi_ccu.body_decl.add(" #define PRINT_ERROR(...) fprintf(stderr, __VA_ARGS__)\n")
+ ffi_ccu.body_decl.add("#endif\n")
+
for nclassdef in n_classdefs do
# Does it declares an extern type?
if nclassdef isa AStdClassdef and nclassdef.n_extern_code_block != null then
end
end
-redef class AExternPropdef
- private var ffi_has_been_compiled = false
-
+redef class AMethPropdef
# Compile the necessary wrapper around this extern method or constructor
fun compile_ffi_method(mmodule: MModule)
do
assert n_extern_code_block != null
- if ffi_has_been_compiled then return
- ffi_has_been_compiled = true
+ if mmodule.compiled_ffi_methods.has(self) then return
+ mmodule.compiled_ffi_methods.add self
var language = n_extern_code_block.language
assert language != null