From cdd6cbedefa859d93e0166bfb85c6551ef67f8ed Mon Sep 17 00:00:00 2001 From: =?utf8?q?Alexis=20Laferri=C3=A8re?= Date: Tue, 26 Feb 2019 10:28:13 -0500 Subject: [PATCH] Java FFI: extra_java_file annotation use full Java class name MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Alexis Laferrière --- lib/android/nit_activity.nit | 2 +- lib/android/service/at_boot.nit | 2 +- lib/android/service/service.nit | 2 +- src/ffi/extra_java_files.nit | 35 +++++++++++++++++++++++++++-------- src/ffi/java.nit | 7 +++++-- src/platform/android.nit | 6 ++++-- tests/test_ffi_java_annot_files.nit | 2 +- 7 files changed, 40 insertions(+), 16 deletions(-) diff --git a/lib/android/nit_activity.nit b/lib/android/nit_activity.nit index f084958..76723b3 100644 --- a/lib/android/nit_activity.nit +++ b/lib/android/nit_activity.nit @@ -36,7 +36,7 @@ # the Java virtual machine. For this reason, the main _must_ execute quickly, # on the main UI thread at least. module nit_activity is - extra_java_files "NitActivity.java" + extra_java_files "nit.app.NitActivity" android_activity "nit.app.NitActivity" end diff --git a/lib/android/service/at_boot.nit b/lib/android/service/at_boot.nit index a2c1868..9669fe7 100644 --- a/lib/android/service/at_boot.nit +++ b/lib/android/service/at_boot.nit @@ -14,7 +14,7 @@ # Import this module to launch `Service` at device boot module at_boot is - extra_java_files "NitBroadcastReceiver.java" + extra_java_files "nit.app.NitBroadcastReceiver" android_manifest """ """ diff --git a/lib/android/service/service.nit b/lib/android/service/service.nit index 901a0e2..b08a9d0 100644 --- a/lib/android/service/service.nit +++ b/lib/android/service/service.nit @@ -14,7 +14,7 @@ # Android service support for _app.nit_ centered around the class `Service` module service is - extra_java_files "NitService.java" + extra_java_files "nit.app.NitService" android_manifest_application """""" end diff --git a/src/ffi/extra_java_files.nit b/src/ffi/extra_java_files.nit index e6dfca2..c355441 100644 --- a/src/ffi/extra_java_files.nit +++ b/src/ffi/extra_java_files.nit @@ -29,7 +29,7 @@ end redef class MModule # Extra Java files to compile with the module - private var extra_java_files: nullable Array[JavaFile] = null + private var extra_java_files: nullable Array[ExtraJavaFile] = null end private class JavaExtraFilesPhase @@ -60,18 +60,20 @@ private class JavaExtraFilesPhase var mmodule = nmodule.mmodule.as(not null) var java_files = mmodule.extra_java_files if java_files == null then - java_files = new Array[JavaFile] + java_files = new Array[ExtraJavaFile] mmodule.extra_java_files = java_files end var format_error = "Syntax Error: `{annot_name}` expects its arguments to be paths to java files." for arg in args do - var path = arg.as_string - if path == null then + var name = arg.as_string + if name == null or name.is_empty then modelbuilder.error(arg, format_error) return end + var path = name.split(".").last + ".java" + # Append specified path to directory of the Nit source file var source_file = nat.location.file if source_file != null then path = "{source_file.filename.dirname}/{path}" @@ -81,7 +83,7 @@ private class JavaExtraFilesPhase continue end - var file = new JavaFile(path) + var file = new ExtraJavaFile(name, path) mmodule.ffi_files.add file java_files.add file end @@ -93,11 +95,28 @@ redef class JavaLanguage do super - # also copy over the java files + # Also copy over the extra Java files var extra_java_files = mmodule.extra_java_files if extra_java_files != null then for file in extra_java_files do - var path = file.filename - path.file_copy_to("{compdir}/{path.basename}") + + var dir = compdir / file.filename.dirname + dir.mkdir + + file.src_path.file_copy_to(compdir/file.filename) end end end + +# User supplied Java file to include with the app for use from the FFI +class ExtraJavaFile + super JavaFile + + autoinit full_name, src_path + + redef var full_name + + # Path to the original user file + var src_path: String + + redef fun filename do return full_name.replace(".", "/") + ".java" +end diff --git a/src/ffi/java.nit b/src/ffi/java.nit index a222885..4894846 100644 --- a/src/ffi/java.nit +++ b/src/ffi/java.nit @@ -367,8 +367,11 @@ end class JavaFile super ExternFile - redef fun makefile_rule_name do return "{filename.basename(".java")}.class" - redef fun makefile_rule_content do return "javac {filename.basename} -d ." + # Full Java class name: package and class + fun full_name: String do return filename.basename(".java") + + redef fun makefile_rule_name do return full_name.replace(".", "/") + ".class" + redef fun makefile_rule_content do return "javac {filename} -d ." redef fun add_to_jar do return true end diff --git a/src/platform/android.nit b/src/platform/android.nit index 3c85633..9bff506 100644 --- a/src/platform/android.nit +++ b/src/platform/android.nit @@ -419,8 +419,10 @@ target_link_libraries(nit_app gc-lib for mmodule in compiler.mainmodule.in_importation.greaters do var extra_java_files = mmodule.extra_java_files if extra_java_files != null then for file in extra_java_files do - var path = file.filename - path.file_copy_to(java_dir/path.basename) + var path = file.src_path + var dir = file.filename.dirname + (java_dir/dir).mkdir + path.file_copy_to(java_dir/file.filename) end end diff --git a/tests/test_ffi_java_annot_files.nit b/tests/test_ffi_java_annot_files.nit index c57135a..aa87613 100644 --- a/tests/test_ffi_java_annot_files.nit +++ b/tests/test_ffi_java_annot_files.nit @@ -15,7 +15,7 @@ # limitations under the License. module test_ffi_java_annot_files is - extra_java_files("test_ffi_java_annot_files_a.java") + extra_java_files("test_ffi_java_annot_files_a") end import java -- 1.7.9.5