Browse Source

* pas2jni: Removed option to create event handler by passing Java method method name as a string. It is not safe, since the target method is treated as unused by Java and the method may be removed from the resulting application.

git-svn-id: trunk@34367 -
yury 9 years ago
parent
commit
e81cc4574f
2 changed files with 7 additions and 24 deletions
  1. 5 21
      utils/pas2jni/readme.txt
  2. 2 3
      utils/pas2jni/writer.pas

+ 5 - 21
utils/pas2jni/readme.txt

@@ -33,11 +33,12 @@ The following Pascal features are supported by pas2jni:
 - pointer type;
 - pointer type;
 - string types;
 - string types;
 - all numeric types;
 - all numeric types;
-- method pointer.
+- method pointer;
+- setters/getters for array elements.
 
 
 USUPPORTED features:
 USUPPORTED features:
-- array;
-- procedure pointer.
+- Full support for arrays;
+- procedure pointer (Not possible to implement. To workaround this limitation create a procedure handler in your Pascal code and call a method pointer declared in some global Pascal class. Then you can assign this method pointer from a Java code).
 
 
 Shared libraries, generated by pas2jni were tested with Java on Windows and Android. It should work on other systems as well.
 Shared libraries, generated by pas2jni were tested with Java on Windows and Android. It should work on other systems as well.
 
 
@@ -84,9 +85,7 @@ In a Java code you get the following TMyClass instance:
 
 
 TMyClass myclass = TMyClass.Create();
 TMyClass myclass = TMyClass.Create();
 
 
-It is possible set a Java handler in 2 ways:
-
-1) Place the handler inline.
+Then you add the event handler in a usual Java way:
 
 
 ...
 ...
   myclass.setOnChange(
   myclass.setOnChange(
@@ -98,21 +97,6 @@ It is possible set a Java handler in 2 ways:
     );
     );
 ...
 ...
 
 
-2) Define the handler as a method in a class.
-
-public class MyJavaClass {
-  private void DoOnChange(TObject Sender) {
-    // The handler code
-  }
-
-  public void main() {
-    ...
-    // Set the handler to the method with the "DoOnChange" name in the current class (this).
-    myclass.setOnChange( new TNotifyEvent(this, "DoOnChange") );
-    ...
-  }
-}
-
 COMMAND LINE OPTIONS
 COMMAND LINE OPTIONS
 
 
 Usage: pas2jni [options] <unit> [<unit2> <unit3> ...]
 Usage: pas2jni [options] <unit> [<unit2> <unit3> ...]

+ 2 - 3
utils/pas2jni/writer.pas

@@ -1433,13 +1433,12 @@ begin
   Fjs.WriteLn(Format('/* Pascal prototype: %s */', [GetProcDeclaration(d, 'Execute')]));
   Fjs.WriteLn(Format('/* Pascal prototype: %s */', [GetProcDeclaration(d, 'Execute')]));
   Fjs.WriteLn(Format('/* Java prototype: %s */', [GetJavaProcDeclaration(d, 'Execute')]));
   Fjs.WriteLn(Format('/* Java prototype: %s */', [GetJavaProcDeclaration(d, 'Execute')]));
 
 
-  Fjs.WriteLn(Format('public static class %s extends %s.system.MethodPtr {', [d.Name, JavaPackage]));
+  Fjs.WriteLn(Format('public static abstract class %s extends %s.system.MethodPtr {', [d.Name, JavaPackage]));
   Fjs.IncI;
   Fjs.IncI;
   Fjs.WriteLn(Format('{ mSignature = "%s"; }', [GetProcSignature(d)]));
   Fjs.WriteLn(Format('{ mSignature = "%s"; }', [GetProcSignature(d)]));
   Fjs.WriteLn(Format('protected %s(long objptr, boolean cleanup) { _pasobj=objptr; }', [d.Name]));
   Fjs.WriteLn(Format('protected %s(long objptr, boolean cleanup) { _pasobj=objptr; }', [d.Name]));
-  Fjs.WriteLn(Format('public %s(Object Obj, String MethodName) { mObject=Obj; mName=MethodName; }', [d.Name]));
   Fjs.WriteLn(Format('public %s() { mObject=this; mName="Execute"; }', [d.Name]));
   Fjs.WriteLn(Format('public %s() { mObject=this; mName="Execute"; }', [d.Name]));
-  Fjs.WriteLn(Format('protected %s throws NoSuchMethodException { throw new NoSuchMethodException(); }', [GetJavaProcDeclaration(d, 'Execute')]));
+  Fjs.WriteLn(Format('protected abstract %s;', [GetJavaProcDeclaration(d, 'Execute')]));
   Fjs.DecI;
   Fjs.DecI;
   Fjs.WriteLn('}');
   Fjs.WriteLn('}');
   Fjs.WriteLn;
   Fjs.WriteLn;