Parcourir la source

[java] Added support for JAR lib files with new zip library

Caue Waneck il y a 13 ans
Parent
commit
e6765b2e74
3 fichiers modifiés avec 28 ajouts et 4 suppressions
  1. 4 2
      Makefile
  2. 9 0
      doc/install.ml
  3. 15 2
      genjava.ml

+ 4 - 2
Makefile

@@ -14,13 +14,13 @@ OUTPUT=haxe
 EXTENSION=
 OCAMLOPT=ocamlopt
 
-CFLAGS= -g -I libs/extlib -I libs/extc -I libs/neko -I libs/javalib -I libs/swflib -I libs/xml-light
+CFLAGS= -g -I libs/extlib -I libs/extc -I libs/neko -I libs/javalib -I libs/ziplib -I libs/swflib -I libs/xml-light
 
 CC_CMD = $(OCAMLOPT) $(CFLAGS) -c $<
 CC_PARSER_CMD = $(OCAMLOPT) -pp camlp4o $(CFLAGS) -c parser.ml
 
 LIBS=unix.cmxa str.cmxa libs/extlib/extLib.cmxa libs/xml-light/xml-light.cmxa libs/swflib/swflib.cmxa \
-	libs/extc/extc.cmxa libs/neko/neko.cmxa libs/javalib/java.cmxa
+	libs/extc/extc.cmxa libs/neko/neko.cmxa libs/javalib/java.cmxa libs/ziplib/zip.cmxa
 
 NATIVE_LIBS=-cclib libs/extc/extc_stubs.o -cclib -lz
 
@@ -41,6 +41,7 @@ libs:
 	make -C libs/extc native
 	make -C libs/neko
 	make -C libs/javalib
+	make -C libs/ziplib
 	make -C libs/swflib
 	make -C libs/xml-light xml-light.cmxa
 
@@ -119,6 +120,7 @@ clean_libs:
 	make -C libs/extlib clean
 	make -C libs/extc clean
 	make -C libs/neko clean
+	make -C libs/ziplib clean
 	make -C libs/javalib clean
 	make -C libs/swflib clean
 	make -C libs/xml-light clean

+ 9 - 0
doc/install.ml

@@ -107,6 +107,13 @@ let compile_libs() =
 	if native then command ("ocamlopt -a -o neko.cmxa " ^ files);
 	Sys.chdir "..";
 
+	(* ZIPLIB *)
+	Sys.chdir "ziplib";
+	let files = "-I .. zlib.mli zlib.ml zip.mli zip.ml" in
+	if bytecode then command ("ocamlc -a -o zip.cma " ^ files);
+	if native then command ("ocamlopt -a -o zip.cmxa " ^ files);
+	Sys.chdir "..";
+
 	(* JAVALIB *)
 	Sys.chdir "javalib";
 	let files = "-I .. jData.mli jReader.ml" in
@@ -140,6 +147,7 @@ let compile() =
 		"libs/swflib/swflib";
 		"libs/xml-light/xml-light";
 		"libs/neko/neko";
+		"libs/ziplib/zib";
 		"libs/javalib/java";
 		"unix";
 		"str"
@@ -150,6 +158,7 @@ let compile() =
 		"libs/xml-light";
 		"libs/extc";
 		"libs/neko";
+		"libs/ziplib";
 		"libs/javalib"
 	] in
 	let mlist = [

+ 15 - 2
genjava.ml

@@ -1991,7 +1991,7 @@ let add_java_lib com file =
     else if Sys.file_exists (file ^ ".jar") then
       file ^ ".jar"
     else
-      failwith "JAR lib " ^ file ^ " not found"
+      failwith "Java lib " ^ file ^ " not found"
     in
 
     (* check if it is a directory or jar file *)
@@ -2005,7 +2005,20 @@ let add_java_lib com file =
         with 
           | _ -> None, real_path, real_path), (fun () -> ())
     | false -> (* open zip file *)
-      (fun (pack, name) -> None, file, file ^ "@" ^ (String.concat "." pack) ^ "/" ^ name ^ ".class" (* TODO *)), (fun () -> ())
+      let zip = Zip.open_in file in
+      let closed = ref false in
+      (fun (pack, name) -> 
+        if !closed then failwith "JAR file already closed";
+        try
+          let location = (String.concat "/" (pack @ [name]) ^ ".class") in
+          let entry = Zip.find_entry zip location in
+          print_endline location;
+          let data = Zip.read_entry zip entry in
+          Some (IO.input_string data), file, file ^ "@" ^ location
+        with
+          | Not_found -> 
+            None, file, file),
+      (fun () -> closed := true; Zip.close_in zip)
   in
   let rec build path p =
     match get_raw_class path, path with