diff --git a/bindings/android-sdk/android_bindings_generator.lpi b/bindings/android-sdk/android_bindings_generator.lpi
index 746e836ed..45f13eaa1 100644
--- a/bindings/android-sdk/android_bindings_generator.lpi
+++ b/bindings/android-sdk/android_bindings_generator.lpi
@@ -70,7 +70,7 @@
-
+
@@ -90,8 +90,8 @@
-
-
+
+
@@ -130,8 +130,8 @@
-
-
+
+
@@ -175,123 +175,123 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
-
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
diff --git a/bindings/android-sdk/android_sdk_bindings_gen.pas b/bindings/android-sdk/android_sdk_bindings_gen.pas
index 9492fd5d9..e61a6bb14 100644
--- a/bindings/android-sdk/android_sdk_bindings_gen.pas
+++ b/bindings/android-sdk/android_sdk_bindings_gen.pas
@@ -19,10 +19,13 @@ type
FClassNum, FMethodNum: Integer;
procedure ProcessModelFile(ASourceFile, APasOutputFile, AJavaOutputFile: string);
procedure ProcessModelLine(ASourceLine: string);
- procedure ProcessModelMethodClass(ASourceLine: string);
- procedure ProcessModelMethodLine(ASourceLine: string);
+ procedure ProcessModelClass(ASourceLine: string);
+ procedure ProcessModelMethod(ASourceLine: string);
+ procedure ProcessModelConstructor(ASourceLine: string);
function GetNextWord(ALine: string; var AStartPos: Integer): string;
function GetPascalTypeName(ABaseName: string): string;
+ function GetJavaResultFunction(AReturnType: string): string;
+ function GetJavaTypeReader(AType: string): string;
public
constructor Create;
destructor Destroy; override;
@@ -105,19 +108,25 @@ begin
// Starting a new class
if ASourceLine[1] = '[' then
begin
- ProcessModelMethodClass(ASourceLine);
+ ProcessModelClass(ASourceLine);
Exit;
end;
// Adding methods to a class
if lCurWord = 'method' then
begin
- ProcessModelMethodLine(ASourceLine);
+ ProcessModelMethod(ASourceLine);
+ Exit;
+ end;
+
+ if lCurWord = 'constructor' then
+ begin
+ ProcessModelConstructor(ASourceLine);
Exit;
end;
end;
-procedure TAndroidSDKBindingsGen.ProcessModelMethodClass(ASourceLine: string);
+procedure TAndroidSDKBindingsGen.ProcessModelClass(ASourceLine: string);
var
lReaderPos: Integer = 1;
lCurWord, lParentClassName: string;
@@ -146,7 +155,7 @@ begin
FJavaOutputIDs.Add(' // ' + FClassName);
end;
-procedure TAndroidSDKBindingsGen.ProcessModelMethodLine(
+procedure TAndroidSDKBindingsGen.ProcessModelMethod(
ASourceLine: string);
var
lReaderPos: Integer = 1;
@@ -179,17 +188,17 @@ begin
FPasOutputImpl.Add(' vAndroidPipesComm.SendInt(Index); // Self, Java Pointer');
lJavaParamSelf := 'param_self_' + FClassName;
- FJavaOutputMethods.Add(' // ' + ASourceLine);
- FJavaOutputMethods.Add(' case ' + lIDString + ':');
- FJavaOutputMethods.Add(' DebugOut("' + lIDString + '");');
- FJavaOutputMethods.Add(' // Self');
- FJavaOutputMethods.Add(' lInt = MyAndroidPipesComm.GetInt();');
- FJavaOutputMethods.Add(' ' + lJavaParamSelf + ' = (' + FClassName + ') ViewElements.get(lInt);');
- FJavaOutputMethods.Add(' // params');
+ FJavaOutputMethods.Add(' // ' + ASourceLine);
+ FJavaOutputMethods.Add(' case ' + lIDString + ':');
+ FJavaOutputMethods.Add(' DebugOut("' + lIDString + '");');
+ FJavaOutputMethods.Add(' // Self');
+ FJavaOutputMethods.Add(' lInt = MyAndroidPipesComm.GetInt();');
+ FJavaOutputMethods.Add(' ' + lJavaParamSelf + ' = (' + FClassName + ') ViewElements.get(lInt);');
+ FJavaOutputMethods.Add(' // params');
// Lists of constants for the IDs
- FPasOutputIDs.Add(' ' + lIDString + ' = 0' + IntToHex(FClassNum*$1000+FMethodNum, 8) + ';');
- FJavaOutputIDs.Add(' static final int ' + lIDString + ' = 0x0' + IntToHex(FClassNum*$1000+FMethodNum, 8) + ';');
+ FPasOutputIDs.Add(' ' + lIDString + ' = $' + IntToHex(FClassNum*$1000+FMethodNum, 8) + ';');
+ FJavaOutputIDs.Add(' static final int ' + lIDString + ' = 0x' + IntToHex(FClassNum*$1000+FMethodNum, 8) + ';');
// Add all parameters
TmpStr := lMethodName + '(';
@@ -208,7 +217,7 @@ begin
// Java parameter reading
lJavaParamVar := 'l' + lParamType + '_' + IntToStr(lParamNum);
- FJavaOutputMethods.Add(' ' + lJavaParamVar + ' = MyAndroidPipesComm.GetInt();');
+ FJavaOutputMethods.Add(' ' + lJavaParamVar + ' = MyAndroidPipesComm.' + GetJavaTypeReader(lParamType) + '();');
lJavaParams := lJavaParams + lJavaParamVar + ', ';
Inc(lParamNum);
@@ -236,18 +245,57 @@ begin
FPasOutputImpl.Add('end;');
FPasOutputImpl.Add('');
- FJavaOutputMethods.Add(' //');
+ FJavaOutputMethods.Add(' //');
if lMethodReturn = 'void' then
begin
- FJavaOutputMethods.Add(' ' + lJavaParamSelf + '.' + lMethodName + '(' + lJavaParams + ');');
- FJavaOutputMethods.Add(' MyAndroidPipesComm.SendResult();');
+ FJavaOutputMethods.Add(' ' + lJavaParamSelf + '.' + lMethodName + '(' + lJavaParams + ');');
+ FJavaOutputMethods.Add(' MyAndroidPipesComm.SendResult();');
end
else
begin
- FJavaOutputMethods.Add(' lResult_' + lMethodReturn + ' = ' + lJavaParamSelf + '.' + lMethodName + '(' + lJavaParams + ');');
- FJavaOutputMethods.Add(' MyAndroidPipesComm.SendIntResult(lResult_' + lMethodReturn + ');');
+ FJavaOutputMethods.Add(' lResult_' + lMethodReturn + ' = ' + lJavaParamSelf + '.' + lMethodName + '(' + lJavaParams + ');');
+ FJavaOutputMethods.Add(' MyAndroidPipesComm.' + GetJavaResultFunction(lMethodReturn) + '(lResult_' + lMethodReturn + ');');
end;
- FJavaOutputMethods.Add(' break;');
+ FJavaOutputMethods.Add(' break;');
+
+ Inc(FMethodNum);
+end;
+
+procedure TAndroidSDKBindingsGen.ProcessModelConstructor(ASourceLine: string);
+var
+ lReaderPos: Integer = 1;
+ lCurWord: string;
+ lParamNum: Integer = 1;
+ lMethodName, lParamType, lParamTypePas, lParamName: string;
+ DeclarationBase, TmpStr, lIDString: string;
+ FPasOutputImplCurLine: Integer;
+begin
+ if ASourceLine = '' then Exit;
+
+ lCurWord := GetNextWord(ASourceLine, lReaderPos);
+
+ // Method type and name
+ lMethodName := GetNextWord(ASourceLine, lReaderPos);
+
+ lIDString := 'amkUI_' + FClassNamePas + '_' + lMethodName;
+
+ FPasOutputClasses.Add(' constructor ' + lMethodName + '();');
+
+ FPasOutputImpl.Add('constructor ' + FClassNamePas + '.' + lMethodName + '();');
+ FPasOutputImpl.Add('begin');
+ FPasOutputImpl.Add(' vAndroidPipesComm.SendByte(ShortInt(amkUICommand));');
+ FPasOutputImpl.Add(' vAndroidPipesComm.SendInt(' + lIDString + ');');
+ FPasOutputImpl.Add(' Index := vAndroidPipesComm.WaitForIntReturn();');
+ FPasOutputImpl.Add('end;');
+
+ FPasOutputIDs.Add(' ' + lIDString + ' = $' + IntToHex(FClassNum*$1000+FMethodNum, 8) + ';');
+ FJavaOutputIDs.Add(' static final int ' + lIDString + ' = 0x' + IntToHex(FClassNum*$1000+FMethodNum, 8) + ';');
+
+ FJavaOutputMethods.Add(' case ' + lIDString + ':');
+ FJavaOutputMethods.Add(' DebugOut("' + lIDString + '");');
+ FJavaOutputMethods.Add(' ViewElements.add(new ' + FClassName + '(activity));');
+ FJavaOutputMethods.Add(' MyAndroidPipesComm.SendIntResult(ViewElements.size() - 1);');
+ FJavaOutputMethods.Add(' break;');
Inc(FMethodNum);
end;
@@ -301,6 +349,19 @@ begin
else Result := 'T' + ABaseName;
end;
+function TAndroidSDKBindingsGen.GetJavaResultFunction(AReturnType: string
+ ): string;
+begin
+ if AReturnType = 'boolean' then Result := 'SendBoolResult'
+ else Result := 'SendIntResult';
+end;
+
+function TAndroidSDKBindingsGen.GetJavaTypeReader(AType: string): string;
+begin
+ if AType = 'boolean' then Exit('GetBool')
+ else Exit('GetInt');
+end;
+
constructor TAndroidSDKBindingsGen.Create;
begin
FSourceFile := TStringList.Create;