Java FFI: extra_java_file annotation use full Java class name
authorAlexis Laferrière <alexis.laf@xymus.net>
Tue, 26 Feb 2019 15:28:13 +0000 (10:28 -0500)
committerAlexis Laferrière <alexis.laf@xymus.net>
Tue, 26 Feb 2019 19:08:51 +0000 (14:08 -0500)
Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

lib/android/nit_activity.nit
lib/android/service/at_boot.nit
lib/android/service/service.nit
src/ffi/extra_java_files.nit
src/ffi/java.nit
src/platform/android.nit
tests/test_ffi_java_annot_files.nit

index f084958..76723b3 100644 (file)
@@ -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
 
index a2c1868..9669fe7 100644 (file)
@@ -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 """
 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
 """
index 901a0e2..b08a9d0 100644 (file)
@@ -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 """<service android:name="nit.app.NitService"></service>"""
 end
 
index e6dfca2..c355441 100644 (file)
@@ -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
index a222885..4894846 100644 (file)
@@ -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
 
index 3c85633..9bff506 100644 (file)
@@ -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
 
index c57135a..aa87613 100644 (file)
@@ -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