diff --git a/examples/androidlcl/android/AndroidManifest.xml b/examples/androidlcl/android/AndroidManifest.xml
new file mode 100644
index 000000000..e6c7a3c56
--- /dev/null
+++ b/examples/androidlcl/android/AndroidManifest.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/androidlcl/android/build.properties b/examples/androidlcl/android/build.properties
new file mode 100644
index 000000000..edc7f2305
--- /dev/null
+++ b/examples/androidlcl/android/build.properties
@@ -0,0 +1,17 @@
+# This file is used to override default values used by the Ant build system.
+#
+# This file must be checked in Version Control Systems, as it is
+# integral to the build system of your project.
+
+# This file is only used by the Ant script.
+
+# You can use this to override default values such as
+# 'source.dir' for the location of your java source folder and
+# 'out.dir' for the location of your output folder.
+
+# You can also use it define how the release builds are signed by declaring
+# the following properties:
+# 'key.store' for the location of your keystore and
+# 'key.alias' for the name of the key to use.
+# The password will be asked during the build when you use the 'release' target.
+
diff --git a/examples/androidlcl/android/build.xml b/examples/androidlcl/android/build.xml
new file mode 100644
index 000000000..73bc2da82
--- /dev/null
+++ b/examples/androidlcl/android/build.xml
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/androidlcl/android/default.properties b/examples/androidlcl/android/default.properties
new file mode 100644
index 000000000..9d79b12c7
--- /dev/null
+++ b/examples/androidlcl/android/default.properties
@@ -0,0 +1,11 @@
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must be checked in Version Control Systems.
+#
+# To customize properties used by the Ant build system use,
+# "build.properties", and override values to adapt the script to your
+# project structure.
+
+# Project target.
+target=android-4
diff --git a/examples/androidlcl/android/local.properties b/examples/androidlcl/android/local.properties
new file mode 100644
index 000000000..d5219d1cb
--- /dev/null
+++ b/examples/androidlcl/android/local.properties
@@ -0,0 +1,10 @@
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must *NOT* be checked in Version Control Systems,
+# as it contains information specific to your local configuration.
+
+# location of the SDK. This is only used by Ant
+# For customization when using a Version Control System, please read the
+# header note.
+sdk.dir=/home/felipe/Programas/android-sdk-linux_x86
diff --git a/examples/androidlcl/android/res/drawable-hdpi/icon.png b/examples/androidlcl/android/res/drawable-hdpi/icon.png
new file mode 100644
index 000000000..1cf343225
Binary files /dev/null and b/examples/androidlcl/android/res/drawable-hdpi/icon.png differ
diff --git a/examples/androidlcl/android/res/drawable-ldpi/icon.png b/examples/androidlcl/android/res/drawable-ldpi/icon.png
new file mode 100644
index 000000000..e433879ed
Binary files /dev/null and b/examples/androidlcl/android/res/drawable-ldpi/icon.png differ
diff --git a/examples/androidlcl/android/res/drawable-mdpi/icon.png b/examples/androidlcl/android/res/drawable-mdpi/icon.png
new file mode 100644
index 000000000..21496a29a
Binary files /dev/null and b/examples/androidlcl/android/res/drawable-mdpi/icon.png differ
diff --git a/examples/androidlcl/android/res/values/strings.xml b/examples/androidlcl/android/res/values/strings.xml
new file mode 100644
index 000000000..da1dbf958
--- /dev/null
+++ b/examples/androidlcl/android/res/values/strings.xml
@@ -0,0 +1,4 @@
+
+
+ LCL Test
+
diff --git a/examples/androidlcl/android/src/com/pascal/androidlcl/AndroidAll.java b/examples/androidlcl/android/src/com/pascal/androidlcl/AndroidAll.java
new file mode 100644
index 000000000..c689d95bd
--- /dev/null
+++ b/examples/androidlcl/android/src/com/pascal/androidlcl/AndroidAll.java
@@ -0,0 +1,525 @@
+package com.pascal.androidlcl;
+
+import android.app.*;
+import android.view.*;
+import android.os.*;
+import android.util.*;
+import android.content.*;
+import android.view.*;
+import android.widget.*;
+import java.util.*;
+import java.lang.*;
+
+public class AndroidAll
+{
+ // info from other classes
+ Activity activity;
+ AndroidPipesComm MyAndroidPipesComm;
+ JavaLang MyJavaLang;
+ // lists of variables
+ ArrayList ViewElements;
+
+ public AndroidAll(AndroidPipesComm AAndroidPipesComm, Activity AActivity, JavaLang AJavaLang)
+ {
+ activity = AActivity;
+ MyAndroidPipesComm = AAndroidPipesComm;
+ MyJavaLang = AJavaLang;
+ ViewElements = new ArrayList();
+ }
+
+ public void DebugOut(String Str)
+ {
+ MyAndroidPipesComm.DebugOut(Str);
+ }
+
+ // DisplayMetrics
+ static final int amkUI_TDisplayMetrics_Create = 0x00101000;
+ static final int amkUI_TDisplayMetrics_density = 0x00101001;
+ static final int amkUI_TDisplayMetrics_densityDpi = 0x00101002;
+ static final int amkUI_TDisplayMetrics_heightPixels = 0x00101003;
+ static final int amkUI_TDisplayMetrics_scaledDensity = 0x00101004;
+ static final int amkUI_TDisplayMetrics_widthPixels = 0x00101005;
+ static final int amkUI_TDisplayMetrics_xdpi = 0x00101006;
+ static final int amkUI_TDisplayMetrics_ydpi = 0x00101007;
+ // Display
+ static final int amkUI_TDisplay_getMetrics = 0x00102000;
+ // WindowManager
+ static final int amkUI_TWindowManager_getDefaultDisplay = 0x00103000;
+ // ViewGroup.LayoutParams
+ static final int amkUI_TViewGroup_LayoutParams_Create = 0x00104000;
+ // View
+ static final int amkUI_TView_setLayoutParams = 0x00105000;
+ static final int amkUI_TView_setVisibility = 0x00105001;
+ // ViewGroup
+ static final int amkUI_TViewGroup_addView = 0x00106000;
+ // LinearLayout
+ static final int amkUI_TLinearLayout_Create = 0x00107000;
+ static final int amkUI_TLinearLayout_setOrientation = 0x00107001;
+ // AbsoluteLayout
+ static final int amkUI_TAbsoluteLayout_Create = 0x00108000;
+ // AbsoluteLayout.LayoutParams
+ static final int amkUI_TAbsoluteLayout_LayoutParams_Create = 0x00109000;
+ // TextView
+ static final int amkUI_TTextView_Create = 0x0010A000;
+ static final int amkUI_TTextView_setText = 0x0010A001;
+ static final int amkUI_TTextView_setOnClickListener = 0x0010A002;
+ static final int amkUI_TTextView_OnClickListener_Start = 0x0010A002;
+ static final int amkUI_TTextView_OnClickListener_Finished = 0x0010A002;
+ static final int amkUI_TTextView_setTextSize = 0x0010A002;
+ // EditText
+ static final int amkUI_TEditText_Create = 0x0010B000;
+ static final int amkUI_TEditText_setText = 0x0010B001;
+ // Button
+ static final int amkUI_TButton_Create = 0x0010C000;
+ static final int amkUI_TButton_setText = 0x0010C001;
+ // FrameLayout
+ // TimePicker
+ static final int amkUI_TTimePicker_Create = 0x0010E000;
+ static final int amkUI_TTimePicker_getCurrentHour = 0x0010E001;
+ static final int amkUI_TTimePicker_setCurrentHour = 0x0010E002;
+ static final int amkUI_TTimePicker_getCurrentMinute = 0x0010E003;
+ static final int amkUI_TTimePicker_setCurrentMinute = 0x0010E004;
+ static final int amkUI_TTimePicker_is24HourView = 0x0010E005;
+ static final int amkUI_TTimePicker_setIs24HourView = 0x0010E006;
+ // ScrollView
+ static final int amkUI_TScrollView_Create = 0x0010F000;
+ // CompoundButton
+ static final int amkUI_TCompoundButton_isChecked = 0x00110000;
+ static final int amkUI_TCompoundButton_performClick = 0x00110001;
+ static final int amkUI_TCompoundButton_setChecked = 0x00110002;
+ static final int amkUI_TCompoundButton_toggle = 0x00110003;
+ // CheckBox
+ static final int amkUI_TCheckBox_Create = 0x00111000;
+
+ public boolean ProcessCommand(int Buffer)
+ {
+ //DebugOut("AndroidUI.ProcessCommand Command=" + java.lang.Integer.toHexString(Buffer));
+ // basic types
+ int lInt, lIndex, lPascalPointer;
+ boolean lBool;
+ float lFloat;
+ // Self params
+ View param_self_View;
+ ViewGroup param_self_ViewGroup;
+ TextView param_self_TextView;
+ Button param_self_Button;
+ EditText param_self_EditText;
+ LinearLayout param_self_LinearLayout;
+ TimePicker param_self_TimePicker;
+ Display param_self_Display;
+ DisplayMetrics param_self_DisplayMetrics;
+ CompoundButton param_self_CompoundButton;
+ WindowManager param_self_WindowManager;
+ // Params
+ ViewGroup.LayoutParams lViewGroup_LayoutParams_1, lViewGroup_LayoutParams_2;
+ DisplayMetrics lDisplayMetrics_1;
+ CharSequence lCharSequence_1;
+ View lView_1;
+ int lint_1, lint_2, lint_3, lint_4;
+ float lfloat_1, lfloat_2;
+ boolean lboolean_1;
+ // Results
+ float lResult_float;
+ int lResult_int;
+ boolean lResult_boolean;
+ Display lResult_Display;
+
+ switch (Buffer)
+ {
+
+ case amkUI_TDisplayMetrics_Create:
+ DebugOut("amkUI_TDisplayMetrics_Create");
+ ViewElements.add(new DisplayMetrics());
+ MyAndroidPipesComm.SendIntResult(ViewElements.size() - 1);
+ break;
+ // field float density
+ case amkUI_TDisplayMetrics_density:
+ DebugOut("amkUI_TDisplayMetrics_density");
+ // Self
+ lInt = MyAndroidPipesComm.GetInt();
+ param_self_DisplayMetrics = (DisplayMetrics) ViewElements.get(lInt);
+ // params
+ //
+ lResult_float = param_self_DisplayMetrics.density;
+ MyAndroidPipesComm.SendFloatResult(lResult_float);
+ break;
+ // field int densityDpi
+ case amkUI_TDisplayMetrics_densityDpi:
+ DebugOut("amkUI_TDisplayMetrics_densityDpi");
+ // Self
+ lInt = MyAndroidPipesComm.GetInt();
+ param_self_DisplayMetrics = (DisplayMetrics) ViewElements.get(lInt);
+ // params
+ //
+ lResult_int = param_self_DisplayMetrics.densityDpi;
+ MyAndroidPipesComm.SendIntResult(lResult_int);
+ break;
+ // field int heightPixels
+ case amkUI_TDisplayMetrics_heightPixels:
+ DebugOut("amkUI_TDisplayMetrics_heightPixels");
+ // Self
+ lInt = MyAndroidPipesComm.GetInt();
+ param_self_DisplayMetrics = (DisplayMetrics) ViewElements.get(lInt);
+ // params
+ //
+ lResult_int = param_self_DisplayMetrics.heightPixels;
+ MyAndroidPipesComm.SendIntResult(lResult_int);
+ break;
+ // field float scaledDensity
+ case amkUI_TDisplayMetrics_scaledDensity:
+ DebugOut("amkUI_TDisplayMetrics_scaledDensity");
+ // Self
+ lInt = MyAndroidPipesComm.GetInt();
+ param_self_DisplayMetrics = (DisplayMetrics) ViewElements.get(lInt);
+ // params
+ //
+ lResult_float = param_self_DisplayMetrics.scaledDensity;
+ MyAndroidPipesComm.SendFloatResult(lResult_float);
+ break;
+ // field int widthPixels
+ case amkUI_TDisplayMetrics_widthPixels:
+ DebugOut("amkUI_TDisplayMetrics_widthPixels");
+ // Self
+ lInt = MyAndroidPipesComm.GetInt();
+ param_self_DisplayMetrics = (DisplayMetrics) ViewElements.get(lInt);
+ // params
+ //
+ lResult_int = param_self_DisplayMetrics.widthPixels;
+ MyAndroidPipesComm.SendIntResult(lResult_int);
+ break;
+ // field float xdpi
+ case amkUI_TDisplayMetrics_xdpi:
+ DebugOut("amkUI_TDisplayMetrics_xdpi");
+ // Self
+ lInt = MyAndroidPipesComm.GetInt();
+ param_self_DisplayMetrics = (DisplayMetrics) ViewElements.get(lInt);
+ // params
+ //
+ lResult_float = param_self_DisplayMetrics.xdpi;
+ MyAndroidPipesComm.SendFloatResult(lResult_float);
+ break;
+ // field float ydpi
+ case amkUI_TDisplayMetrics_ydpi:
+ DebugOut("amkUI_TDisplayMetrics_ydpi");
+ // Self
+ lInt = MyAndroidPipesComm.GetInt();
+ param_self_DisplayMetrics = (DisplayMetrics) ViewElements.get(lInt);
+ // params
+ //
+ lResult_float = param_self_DisplayMetrics.ydpi;
+ MyAndroidPipesComm.SendFloatResult(lResult_float);
+ break;
+ // method void getMetrics(DisplayMetrics outMetrics)
+ case amkUI_TDisplay_getMetrics:
+ DebugOut("amkUI_TDisplay_getMetrics");
+ // Self
+ lInt = MyAndroidPipesComm.GetInt();
+ param_self_Display = (Display) ViewElements.get(lInt);
+ // params
+ lInt = MyAndroidPipesComm.GetInt();
+ lDisplayMetrics_1 = (DisplayMetrics) ViewElements.get(lInt);
+ //
+ param_self_Display.getMetrics(lDisplayMetrics_1);
+ MyAndroidPipesComm.SendResult();
+ break;
+ // method Display getDefaultDisplay()
+ case amkUI_TWindowManager_getDefaultDisplay:
+ DebugOut("amkUI_TWindowManager_getDefaultDisplay");
+ // Self
+ lInt = MyAndroidPipesComm.GetInt();
+ param_self_WindowManager = (WindowManager) ViewElements.get(lInt);
+ // params
+ //
+ lResult_Display = param_self_WindowManager.getDefaultDisplay();
+ ViewElements.add(lResult_Display);
+ MyAndroidPipesComm.SendIntResult(ViewElements.size() - 1);
+ break;
+ case amkUI_TViewGroup_LayoutParams_Create:
+ DebugOut("amkUI_TViewGroup_LayoutParams_Create");
+ lint_1 = MyAndroidPipesComm.GetInt();
+ lint_2 = MyAndroidPipesComm.GetInt();
+ ViewElements.add(new ViewGroup.LayoutParams(lint_1, lint_2));
+ MyAndroidPipesComm.SendIntResult(ViewElements.size() - 1);
+ break;
+ // method void setLayoutParams(ViewGroup.LayoutParams params);
+ case amkUI_TView_setLayoutParams:
+ DebugOut("amkUI_TView_setLayoutParams");
+ // Self
+ lInt = MyAndroidPipesComm.GetInt();
+ param_self_View = (View) ViewElements.get(lInt);
+ // params
+ lInt = MyAndroidPipesComm.GetInt();
+ lViewGroup_LayoutParams_1 = (ViewGroup.LayoutParams) ViewElements.get(lInt);
+ //
+ param_self_View.setLayoutParams(lViewGroup_LayoutParams_1);
+ MyAndroidPipesComm.SendResult();
+ break;
+ // method void setVisibility(int visibility);
+ case amkUI_TView_setVisibility:
+ DebugOut("amkUI_TView_setVisibility");
+ // Self
+ lInt = MyAndroidPipesComm.GetInt();
+ param_self_View = (View) ViewElements.get(lInt);
+ // params
+ lInt = MyAndroidPipesComm.GetInt();
+ lint_1 = lInt;
+ //
+ param_self_View.setVisibility(lint_1);
+ MyAndroidPipesComm.SendResult();
+ break;
+ // method void addView(View child, ViewGroup.LayoutParams params);
+ case amkUI_TViewGroup_addView:
+ DebugOut("amkUI_TViewGroup_addView");
+ // Self
+ lInt = MyAndroidPipesComm.GetInt();
+ param_self_ViewGroup = (ViewGroup) ViewElements.get(lInt);
+ // params
+ lInt = MyAndroidPipesComm.GetInt();
+ lView_1 = (View) ViewElements.get(lInt);
+ lInt = MyAndroidPipesComm.GetInt();
+ lViewGroup_LayoutParams_2 = (ViewGroup.LayoutParams) ViewElements.get(lInt);
+ //
+ param_self_ViewGroup.addView(lView_1, lViewGroup_LayoutParams_2);
+ MyAndroidPipesComm.SendResult();
+ break;
+ case amkUI_TLinearLayout_Create:
+ DebugOut("amkUI_TLinearLayout_Create");
+ ViewElements.add(new LinearLayout(activity));
+ MyAndroidPipesComm.SendIntResult(ViewElements.size() - 1);
+ break;
+ // method void setOrientation(int orientation);
+ case amkUI_TLinearLayout_setOrientation:
+ DebugOut("amkUI_TLinearLayout_setOrientation");
+ // Self
+ lInt = MyAndroidPipesComm.GetInt();
+ param_self_LinearLayout = (LinearLayout) ViewElements.get(lInt);
+ // params
+ lInt = MyAndroidPipesComm.GetInt();
+ lint_1 = lInt;
+ //
+ param_self_LinearLayout.setOrientation(lint_1);
+ MyAndroidPipesComm.SendResult();
+ break;
+ case amkUI_TAbsoluteLayout_Create:
+ DebugOut("amkUI_TAbsoluteLayout_Create");
+ ViewElements.add(new AbsoluteLayout(activity));
+ MyAndroidPipesComm.SendIntResult(ViewElements.size() - 1);
+ break;
+ case amkUI_TAbsoluteLayout_LayoutParams_Create:
+ DebugOut("amkUI_TAbsoluteLayout_LayoutParams_Create");
+ lint_1 = MyAndroidPipesComm.GetInt();
+ lint_2 = MyAndroidPipesComm.GetInt();
+ lint_3 = MyAndroidPipesComm.GetInt();
+ lint_4 = MyAndroidPipesComm.GetInt();
+ ViewElements.add(new AbsoluteLayout.LayoutParams(lint_1, lint_2, lint_3, lint_4));
+ MyAndroidPipesComm.SendIntResult(ViewElements.size() - 1);
+ break;
+ case amkUI_TTextView_Create:
+ DebugOut("amkUI_TTextView_Create");
+ ViewElements.add(new TextView(activity));
+ MyAndroidPipesComm.SendIntResult(ViewElements.size() - 1);
+ break;
+ // method void setText(CharSequence AText); virtual;
+ case amkUI_TTextView_setText:
+ DebugOut("amkUI_TTextView_setText");
+ // Self
+ lInt = MyAndroidPipesComm.GetInt();
+ param_self_TextView = (TextView) ViewElements.get(lInt);
+ // params
+ lInt = MyAndroidPipesComm.GetInt();
+ lCharSequence_1 = (CharSequence) MyJavaLang.LangElements.get(lInt);
+ //
+ param_self_TextView.setText(lCharSequence_1);
+ MyAndroidPipesComm.SendResult();
+ break;
+ // method void setTextSize(int unit_; float size);
+ case amkUI_TTextView_setTextSize:
+ DebugOut("amkUI_TTextView_setTextSize");
+ // Self
+ lInt = MyAndroidPipesComm.GetInt();
+ param_self_TextView = (TextView) ViewElements.get(lInt);
+ // params
+ lInt = MyAndroidPipesComm.GetInt();
+ lint_1 = lInt;
+ lFloat = MyAndroidPipesComm.GetFloat();
+ lfloat_2 = lFloat;
+ //
+ param_self_TextView.setTextSize(lint_1, lfloat_2);
+ MyAndroidPipesComm.SendResult();
+ break;
+ case amkUI_TEditText_Create:
+ DebugOut("amkUI_TEditText_Create");
+ ViewElements.add(new EditText(activity));
+ MyAndroidPipesComm.SendIntResult(ViewElements.size() - 1);
+ break;
+ // method void setText(CharSequence AText); override;
+ case amkUI_TEditText_setText:
+ DebugOut("amkUI_TEditText_setText");
+ // Self
+ lInt = MyAndroidPipesComm.GetInt();
+ param_self_EditText = (EditText) ViewElements.get(lInt);
+ // params
+ lInt = MyAndroidPipesComm.GetInt();
+ lCharSequence_1 = (CharSequence) MyJavaLang.LangElements.get(lInt);
+ //
+ param_self_EditText.setText(lCharSequence_1);
+ MyAndroidPipesComm.SendResult();
+ break;
+ case amkUI_TButton_Create:
+ DebugOut("amkUI_TButton_Create");
+ ViewElements.add(new Button(activity));
+ MyAndroidPipesComm.SendIntResult(ViewElements.size() - 1);
+ break;
+ // method void setText(CharSequence AText); override;
+ case amkUI_TButton_setText:
+ DebugOut("amkUI_TButton_setText");
+ // Self
+ lInt = MyAndroidPipesComm.GetInt();
+ param_self_Button = (Button) ViewElements.get(lInt);
+ // params
+ lInt = MyAndroidPipesComm.GetInt();
+ lCharSequence_1 = (CharSequence) MyJavaLang.LangElements.get(lInt);
+ //
+ param_self_Button.setText(lCharSequence_1);
+ MyAndroidPipesComm.SendResult();
+ break;
+ case amkUI_TTimePicker_Create:
+ DebugOut("amkUI_TTimePicker_Create");
+ ViewElements.add(new TimePicker(activity));
+ MyAndroidPipesComm.SendIntResult(ViewElements.size() - 1);
+ break;
+ // method int getCurrentHour();
+ case amkUI_TTimePicker_getCurrentHour:
+ DebugOut("amkUI_TTimePicker_getCurrentHour");
+ // Self
+ lInt = MyAndroidPipesComm.GetInt();
+ param_self_TimePicker = (TimePicker) ViewElements.get(lInt);
+ // params
+ //
+ lResult_int = param_self_TimePicker.getCurrentHour();
+ MyAndroidPipesComm.SendIntResult(lResult_int);
+ break;
+ // method void setCurrentHour(int currentHour);
+ case amkUI_TTimePicker_setCurrentHour:
+ DebugOut("amkUI_TTimePicker_setCurrentHour");
+ // Self
+ lInt = MyAndroidPipesComm.GetInt();
+ param_self_TimePicker = (TimePicker) ViewElements.get(lInt);
+ // params
+ lInt = MyAndroidPipesComm.GetInt();
+ lint_1 = lInt;
+ //
+ param_self_TimePicker.setCurrentHour(lint_1);
+ MyAndroidPipesComm.SendResult();
+ break;
+ // method int getCurrentMinute;
+ case amkUI_TTimePicker_getCurrentMinute:
+ DebugOut("amkUI_TTimePicker_getCurrentMinute");
+ // Self
+ lInt = MyAndroidPipesComm.GetInt();
+ param_self_TimePicker = (TimePicker) ViewElements.get(lInt);
+ // params
+ //
+ lResult_int = param_self_TimePicker.getCurrentMinute();
+ MyAndroidPipesComm.SendIntResult(lResult_int);
+ break;
+ // method void setCurrentMinute(int currentMinute);
+ case amkUI_TTimePicker_setCurrentMinute:
+ DebugOut("amkUI_TTimePicker_setCurrentMinute");
+ // Self
+ lInt = MyAndroidPipesComm.GetInt();
+ param_self_TimePicker = (TimePicker) ViewElements.get(lInt);
+ // params
+ lInt = MyAndroidPipesComm.GetInt();
+ lint_1 = lInt;
+ //
+ param_self_TimePicker.setCurrentMinute(lint_1);
+ MyAndroidPipesComm.SendResult();
+ break;
+ // method boolean is24HourView;
+ case amkUI_TTimePicker_is24HourView:
+ DebugOut("amkUI_TTimePicker_is24HourView");
+ // Self
+ lInt = MyAndroidPipesComm.GetInt();
+ param_self_TimePicker = (TimePicker) ViewElements.get(lInt);
+ // params
+ //
+ lResult_boolean = param_self_TimePicker.is24HourView();
+ MyAndroidPipesComm.SendBoolResult(lResult_boolean);
+ break;
+ // method void setIs24HourView(boolean AIs24HourView);
+ case amkUI_TTimePicker_setIs24HourView:
+ DebugOut("amkUI_TTimePicker_setIs24HourView");
+ // Self
+ lInt = MyAndroidPipesComm.GetInt();
+ param_self_TimePicker = (TimePicker) ViewElements.get(lInt);
+ // params
+ lBool = MyAndroidPipesComm.GetBool();
+ lboolean_1 = lBool;
+ //
+ param_self_TimePicker.setIs24HourView(lboolean_1);
+ MyAndroidPipesComm.SendResult();
+ break;
+ case amkUI_TScrollView_Create:
+ DebugOut("amkUI_TScrollView_Create");
+ ViewElements.add(new ScrollView(activity));
+ MyAndroidPipesComm.SendIntResult(ViewElements.size() - 1);
+ break;
+ // method boolean isChecked()
+ case amkUI_TCompoundButton_isChecked:
+ DebugOut("amkUI_TCompoundButton_isChecked");
+ // Self
+ lInt = MyAndroidPipesComm.GetInt();
+ param_self_CompoundButton = (CompoundButton) ViewElements.get(lInt);
+ // params
+ //
+ lResult_boolean = param_self_CompoundButton.isChecked();
+ MyAndroidPipesComm.SendBoolResult(lResult_boolean);
+ break;
+ // method boolean performClick()
+ case amkUI_TCompoundButton_performClick:
+ DebugOut("amkUI_TCompoundButton_performClick");
+ // Self
+ lInt = MyAndroidPipesComm.GetInt();
+ param_self_CompoundButton = (CompoundButton) ViewElements.get(lInt);
+ // params
+ //
+ lResult_boolean = param_self_CompoundButton.performClick();
+ MyAndroidPipesComm.SendBoolResult(lResult_boolean);
+ break;
+ // method void setChecked(boolean checked)
+ case amkUI_TCompoundButton_setChecked:
+ DebugOut("amkUI_TCompoundButton_setChecked");
+ // Self
+ lInt = MyAndroidPipesComm.GetInt();
+ param_self_CompoundButton = (CompoundButton) ViewElements.get(lInt);
+ // params
+ lBool = MyAndroidPipesComm.GetBool();
+ lboolean_1 = lBool;
+ //
+ param_self_CompoundButton.setChecked(lboolean_1);
+ MyAndroidPipesComm.SendResult();
+ break;
+ // method void toggle()
+ case amkUI_TCompoundButton_toggle:
+ DebugOut("amkUI_TCompoundButton_toggle");
+ // Self
+ lInt = MyAndroidPipesComm.GetInt();
+ param_self_CompoundButton = (CompoundButton) ViewElements.get(lInt);
+ // params
+ //
+ param_self_CompoundButton.toggle();
+ MyAndroidPipesComm.SendResult();
+ break;
+ case amkUI_TCheckBox_Create:
+ DebugOut("amkUI_TCheckBox_Create");
+ ViewElements.add(new CheckBox(activity));
+ MyAndroidPipesComm.SendIntResult(ViewElements.size() - 1);
+ break;
+
+ default:
+ return false;
+ }
+ return true;
+ }
+}
diff --git a/examples/androidlcl/android/src/com/pascal/androidlcl/AndroidApp.java b/examples/androidlcl/android/src/com/pascal/androidlcl/AndroidApp.java
new file mode 100644
index 000000000..6ee44b1f2
--- /dev/null
+++ b/examples/androidlcl/android/src/com/pascal/androidlcl/AndroidApp.java
@@ -0,0 +1,77 @@
+package com.pascal.androidlcl;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.os.*;
+import android.util.*;
+import android.content.*;
+import android.view.*;
+import android.widget.*;
+import java.util.*;
+
+public class AndroidApp
+{
+ // info from other classes
+ Activity activity;
+ AndroidPipesComm MyAndroidPipesComm;
+ JavaLang MyJavaLang;
+ AndroidAll MyAndroidAll;
+
+ // lists of variables
+ ArrayList ViewElements;
+
+ //
+ // android.app.*
+ static final int amkUI_Activity_setContentView = 0x0000;
+ static final int amkUI_Activity_getWindowManager = 0x0080;
+
+ public AndroidApp(AndroidPipesComm AAndroidPipesComm, Activity AActivity, JavaLang AJavaLang, AndroidAll AAndroidAll)
+ {
+ activity = AActivity;
+ MyAndroidPipesComm = AAndroidPipesComm;
+ MyJavaLang = AJavaLang;
+ MyAndroidAll = AAndroidAll;
+ ViewElements = AAndroidAll.ViewElements;
+ }
+
+ public void DebugOut(String Str)
+ {
+ MyAndroidPipesComm.DebugOut(Str);
+ }
+
+ public boolean ProcessCommand(int Buffer)
+ {
+ //DebugOut("AndroidUI.ProcessCommand");
+ //DebugOut("AndroidUI.ProcessCommand Command=" + java.lang.Integer.toHexString(Buffer));
+
+ int lInt, lIndex, lPascalPointer;
+ Integer lTag;
+ TextView lTextView;
+ CharSequence lChars;
+ //
+ WindowManager param_self_WindowManager;
+ //
+
+ switch (Buffer)
+ {
+ // android.app.Activity
+ // public void setContentView (View view)
+ case amkUI_Activity_setContentView:
+ DebugOut("amkUI_Activity_setContentView");
+ lInt = MyAndroidPipesComm.GetInt();
+ View lView = (View) ViewElements.get(lInt);
+ activity.setContentView(lView);
+ MyAndroidPipesComm.SendResult();
+ break;
+/* case amkUI_Activity_getWindowManager:
+ DebugOut("amkUI_Activity_getWindowManager");
+ WindowManagerElements.add(activity.getWindowManager());
+ MyAndroidPipesComm.SendIntResult(WindowManagerElements.size() - 1);
+ break;*/
+ default:
+ return false;
+ }
+ return true;
+ }
+}
+
diff --git a/examples/androidlcl/android/src/com/pascal/androidlcl/AndroidLCLTest.java b/examples/androidlcl/android/src/com/pascal/androidlcl/AndroidLCLTest.java
new file mode 100644
index 000000000..28abee283
--- /dev/null
+++ b/examples/androidlcl/android/src/com/pascal/androidlcl/AndroidLCLTest.java
@@ -0,0 +1,273 @@
+package com.pascal.androidlcl;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.os.*;
+import android.util.Log;
+import android.content.*;
+import android.view.*;
+import android.widget.*;
+import java.io.*;
+
+public class AndroidLCLTest extends Activity
+{
+ AndroidPipesComm MyAndroidPipesComm;
+ String ExecutablePath;
+ // Debug
+ boolean DEBUG_PASCAL4ANDROID = true;
+
+ // Android Message subtype
+ static int ams_ActivityCallback_onCreateStarted = 0x0001;
+ static int ams_ActivityCallback_onStartStarted = 0x0002;
+ static int ams_ActivityCallback_onRestartStarted = 0x0003;
+ static int ams_ActivityCallback_onResumeStarted = 0x0004;
+ static int ams_ActivityCallback_onPauseStarted = 0x0005;
+ static int ams_ActivityCallback_onStopStarted = 0x0006;
+ static int ams_ActivityCallback_onDestroyStarted = 0x0007;
+ static int ams_ActivityCallback_onCreateOptionsMenuStarted = 0x0008;
+ static int ams_ActivityCallback_onKeyUpStarted = 0x0010;
+
+ static int ams_ActivityCallback_onCreateFinished = 0x1001;
+ static int ams_ActivityCallback_onStartFinished = 0x1002;
+ static int ams_ActivityCallback_onRestartFinished = 0x1003;
+ static int ams_ActivityCallback_onResumeFinished = 0x1004;
+ static int ams_ActivityCallback_onPauseFinished = 0x1005;
+ static int ams_ActivityCallback_onStopFinished = 0x1006;
+ static int ams_ActivityCallback_onDestroyFinished = 0x1007;
+ static int ams_ActivityCallback_onCreateOptionsMenuFinished = 0x1008;
+ static int ams_ActivityCallback_onKeyUpFinished = 0x1010;
+
+ Button.OnClickListener buttonClickCallback = new Button.OnClickListener()
+ {
+ public void onClick(View v)
+ {
+ MyAndroidPipesComm.DebugOut("Click!");
+ }
+ };
+
+ /** Called when the activity is first created. */
+ @Override
+ public void onCreate(Bundle savedInstanceState)
+ {
+ super.onCreate(savedInstanceState);
+
+ MyAndroidPipesComm = new AndroidPipesComm(this);
+
+ // Prepare the application
+ ExecutablePath = getApplicationContext().getFilesDir() + "/androidlcltest";
+
+ String LibraryPathPath = "/data/data/com.pascal.androidlcl/lib/libandroidlcltest.so";
+
+ MyAndroidPipesComm.DebugOut("Executing application " + LibraryPathPath + " copied to " + ExecutablePath);
+
+ String Str = FileCopy(LibraryPathPath, ExecutablePath);
+
+ String Str2 = RunProgram("/system/bin/chmod", "755", ExecutablePath);
+
+ // Run the application
+ RunPascalProgram(ExecutablePath);
+
+ // Waits until the Pascal side finishes its initialization
+ MyAndroidPipesComm.DebugOut("WaitForPascalMessage(amkActivityCallback, ams_ActivityCallback_onCreateFinished)");
+ MyAndroidPipesComm.WaitForPascalMessage(MyAndroidPipesComm.amkActivityCallback, ams_ActivityCallback_onCreateFinished);
+ MyAndroidPipesComm.DebugOut("END onCreate");
+ }
+
+ /** */
+ @Override
+ protected void onStart()
+ {
+ MyAndroidPipesComm.DebugOut("START onStart");
+ super.onStart();
+ MyAndroidPipesComm.SendMessage(MyAndroidPipesComm.amkActivityCallback, ams_ActivityCallback_onStartStarted);
+ MyAndroidPipesComm.WaitForPascalMessage(MyAndroidPipesComm.amkActivityCallback, ams_ActivityCallback_onStartFinished);
+ MyAndroidPipesComm.DebugOut("END onStart");
+ }
+
+ /** */
+ @Override
+ protected void onRestart()
+ {
+ MyAndroidPipesComm.DebugOut("START onRestart");
+ super.onRestart();
+ MyAndroidPipesComm.SendMessage(MyAndroidPipesComm.amkActivityCallback, ams_ActivityCallback_onRestartStarted);
+ MyAndroidPipesComm.WaitForPascalMessage(MyAndroidPipesComm.amkActivityCallback, ams_ActivityCallback_onRestartFinished);
+ MyAndroidPipesComm.DebugOut("END onRestart");
+ }
+
+ /** */
+ @Override
+ protected void onResume()
+ {
+ MyAndroidPipesComm.DebugOut("START onResume");
+ super.onResume();
+ MyAndroidPipesComm.SendMessage(MyAndroidPipesComm.amkActivityCallback, ams_ActivityCallback_onResumeStarted);
+ MyAndroidPipesComm.WaitForPascalMessage(MyAndroidPipesComm.amkActivityCallback, ams_ActivityCallback_onResumeFinished);
+ MyAndroidPipesComm.DebugOut("END onResume");
+ }
+
+ /** */
+ @Override
+ protected void onPause()
+ {
+ MyAndroidPipesComm.DebugOut("START onPause");
+ super.onPause();
+ MyAndroidPipesComm.SendMessage(MyAndroidPipesComm.amkActivityCallback, ams_ActivityCallback_onPauseStarted);
+ MyAndroidPipesComm.WaitForPascalMessage(MyAndroidPipesComm.amkActivityCallback, ams_ActivityCallback_onPauseFinished);
+ MyAndroidPipesComm.DebugOut("END onPause");
+ }
+
+ /** */
+ @Override
+ protected void onStop()
+ {
+ MyAndroidPipesComm.DebugOut("START onStop");
+ super.onStop();
+ MyAndroidPipesComm.SendMessage(MyAndroidPipesComm.amkActivityCallback, ams_ActivityCallback_onStopStarted);
+ MyAndroidPipesComm.WaitForPascalMessage(MyAndroidPipesComm.amkActivityCallback, ams_ActivityCallback_onStopFinished);
+ MyAndroidPipesComm.DebugOut("END onStop");
+ }
+
+ /** */
+ @Override
+ protected void onDestroy()
+ {
+ MyAndroidPipesComm.DebugOut("START onDestroy");
+ super.onDestroy();
+ MyAndroidPipesComm.SendMessage(MyAndroidPipesComm.amkActivityCallback, ams_ActivityCallback_onStartStarted);
+ MyAndroidPipesComm.WaitForPascalMessage(MyAndroidPipesComm.amkActivityCallback, ams_ActivityCallback_onStartFinished);
+ MyAndroidPipesComm.DebugOut("END onDestroy");
+ }
+
+ // public boolean onCreateOptionsMenu (Menu menu)
+ /*@Override
+ public boolean onCreateOptionsMenu(Menu menu)
+ {
+ if (DEBUG_PASCAL4ANDROID == true) MyAndroidPipesComm.DebugOut("START onCreateOptionsMenu");
+ MyAndroidPipesComm.SendMessage(MyAndroidPipesComm.amkActivityCallback, ams_ActivityCallback_onCreateOptionsMenuStarted);
+ MyAndroidPipesComm.MyAndroidMenu.MenuElements.add(menu);
+ int lMenuIndex = MyAndroidPipesComm.MyAndroidMenu.MenuElements.size() - 1;
+ MyAndroidPipesComm.SendInt(lMenuIndex);
+ MyAndroidPipesComm.WaitForPascalMessage(MyAndroidPipesComm.amkActivityCallback, ams_ActivityCallback_onCreateOptionsMenuFinished);
+ int lInt = MyAndroidPipesComm.GetInt();
+ // ToDo: If we start supporting object deletion then we need to use indexOf to get the new index
+ MyAndroidPipesComm.MyAndroidMenu.MenuElements.remove(lMenuIndex);
+ if (DEBUG_PASCAL4ANDROID == true) MyAndroidPipesComm.DebugOut("END onCreateOptionsMenu");
+ return (lInt != 0);
+ }*/
+
+ // generic Key Listener
+ @Override
+ public boolean onKeyUp(int keyCode, KeyEvent event)
+ {
+ if (DEBUG_PASCAL4ANDROID == true) MyAndroidPipesComm.DebugOut("START onKeyUp");
+ MyAndroidPipesComm.SendMessage(MyAndroidPipesComm.amkActivityCallback, ams_ActivityCallback_onKeyUpStarted);
+ MyAndroidPipesComm.SendInt(keyCode);
+ // ToDo: Also send the KeyEvent
+ //MyAndroidPipesComm.MyAndroidMenu.MenuElements.add(menu);
+ //int lMenuIndex = MyAndroidPipesComm.MyAndroidMenu.MenuElements.size() - 1;
+ MyAndroidPipesComm.WaitForPascalMessage(MyAndroidPipesComm.amkActivityCallback, ams_ActivityCallback_onKeyUpFinished);
+ int lInt = MyAndroidPipesComm.GetInt();
+ if (DEBUG_PASCAL4ANDROID == true) MyAndroidPipesComm.DebugOut("END onCreateOptionsMenu");
+ if (lInt != 0) return true;
+ return super.onKeyUp(keyCode, event);
+ }
+
+ //
+ private static String FileCopy(String srFile, String dtFile)
+ {
+ try
+ {
+ File f1 = new File(srFile);
+ File f2 = new File(dtFile);
+ InputStream in = new FileInputStream(f1);
+
+ //For Overwrite the file.
+ OutputStream out = new FileOutputStream(f2, true);
+
+ byte[] buf = new byte[1024];
+ int len;
+ while ((len = in.read(buf)) > 0){
+ out.write(buf, 0, len);
+ }
+ in.close();
+ out.close();
+
+ return "Success dest=" + dtFile;
+ }
+ catch(FileNotFoundException e)
+ {
+ return "Error=FileNotFoundException=" + e.getMessage();
+ }
+ catch(IOException e)
+ {
+ return "Error=IOException=" + e.getMessage();
+ }
+ }
+
+ /*
+ Simple method for running external applications.
+ It waits until the program finishes running.
+ it uses Runtime.getRuntime()
+ */
+ public String RunProgram(String cmd, String param1, String param2)
+ {
+ String output = "";
+ try
+ {
+ if (param1 == null) param1 = "";
+ if (param2 == null) param2 = "";
+
+ // Runs the application
+ java.lang.Process process = Runtime.getRuntime().exec(cmd + " " + param1 + " " + param2);
+
+ // Now connects pipes to it
+ DataInputStream reader = new DataInputStream(process.getInputStream());
+
+ // Waits until it finishes
+ process.waitFor();
+
+ // And stores the result of the pipes in the result of the function
+ String line;
+ String separator = System.getProperty("line.separator");
+ while ((line = reader.readLine()) != null)
+ {
+ output += line + separator;
+ }
+ }
+ catch (IOException e)
+ {
+ output += "error=IOException=" + e.getMessage();
+ }
+ catch (InterruptedException e)
+ {
+ output += "error=InterruptedException=" + e.getMessage();
+ }
+
+ return output;
+ }
+
+ /*
+ This function will run a Pascal program and interact with it via pipes
+ Uses Runtime.getRuntime()
+ */
+ public void RunPascalProgram(String cmd)
+ {
+ try
+ {
+ // Runs the application
+ MyAndroidPipesComm.PascalProcess = Runtime.getRuntime().exec(cmd);
+
+ // Now connects pipes to it
+ MyAndroidPipesComm.writer = new DataOutputStream(
+ MyAndroidPipesComm.PascalProcess.getOutputStream());
+ MyAndroidPipesComm.reader = new DataInputStream(
+ MyAndroidPipesComm.PascalProcess.getInputStream());
+ }
+ catch (IOException e)
+ {
+ MyAndroidPipesComm.DebugOut("error=IOException=" + e.getMessage());
+ }
+ }
+}
+
diff --git a/examples/androidlcl/android/src/com/pascal/androidlcl/AndroidPipesComm.java b/examples/androidlcl/android/src/com/pascal/androidlcl/AndroidPipesComm.java
new file mode 100644
index 000000000..51d25e1f5
--- /dev/null
+++ b/examples/androidlcl/android/src/com/pascal/androidlcl/AndroidPipesComm.java
@@ -0,0 +1,276 @@
+package com.pascal.androidlcl;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.os.*;
+import android.util.Log;
+import android.content.*;
+import android.view.*;
+import android.widget.*;
+import java.io.*;
+
+public class AndroidPipesComm
+{
+ // info from other classes
+ Activity activity;
+
+ // Data pool accessed by many methods
+ java.lang.Process PascalProcess;
+ DataOutputStream writer;
+ DataInputStream reader;
+ // Data pool to solve the lack of passing parameter by reference
+ byte lType = 0;
+ int lSubtype = 0;
+
+ // Android Message Kind
+ static byte amkFloatResult = 103;
+ static byte amkIntResult = 102;
+ static byte amkResult = 101;
+ static byte amkActivityCallback = 0;
+ static byte amkLog = 1;
+ static byte amkUICommand = 2;
+ static byte amkJavaLangCall = 3;
+ static byte amkTimer = 4;
+
+ // Add / remove modules here
+ public JavaLang MyJavaLang;
+ public AndroidAll MyAndroidAll;
+ public AndroidApp MyAndroidApp;
+
+ public AndroidPipesComm(Activity AActivity)
+ {
+ activity = AActivity;
+ MyJavaLang = new JavaLang(this);
+ MyAndroidAll = new AndroidAll(this, activity, MyJavaLang);
+ MyAndroidApp = new AndroidApp(this, activity, MyJavaLang, MyAndroidAll);
+ }
+
+ public void DebugOut(String Str)
+ {
+ Log.v("AndroidPipesComm:", Str);
+// tv.setText(tv.getText().toString() + Str);
+ }
+
+ public void ErrorOut(String Str)
+ {
+ Log.v("AndroidPipesComm:", Str);
+// tv.setText(tv.getText().toString() + Str);
+ }
+
+ // Waits for a particular Pascal message.
+ // In the mean time processes any other incoming messages
+ public void WaitForPascalMessage(byte AExpectedMessageType, int AExpectedMessageSubtype)
+ {
+ DebugOut("START WaitForPascalMessage AExpectedMessageType=" + AExpectedMessageType
+ + " AExpectedMessageSubtype=" + java.lang.Integer.toHexString(AExpectedMessageSubtype));
+
+ while (true)
+ {
+ WaitAndProcessPascalMessage();
+ DebugOut("MID_END WaitForPascalMessage lType=" + lType + " lSubtype=" + java.lang.Integer.toHexString(lSubtype));
+ if ((lType == AExpectedMessageType) && (lSubtype == AExpectedMessageSubtype)) return;
+ if ((lType == amkActivityCallback) && (AExpectedMessageType == amkActivityCallback)) return;
+ }
+ }
+
+ // Waits for and processes a Pascal message
+ public void WaitAndProcessPascalMessage()
+ {
+ try
+ {
+ DebugOut("WaitAndProcessPascalMessage");
+ byte Buffer = reader.readByte(); // blocking read
+ lType = Buffer;
+ lSubtype = 0;
+
+ if (Buffer == amkActivityCallback)
+ {
+ DebugOut("amkActivityCallback");
+// lSubtype = reader.readInt(); // blocking read
+ }
+ else if (Buffer == amkLog)
+ {
+ DebugOut("amkLog");
+ }
+ else if (Buffer == amkUICommand)
+ {
+ DebugOut("amkUICommand");
+ lSubtype = reader.readInt(); // blocking read
+ if (MyAndroidAll.ProcessCommand(lSubtype) == true) ;
+ else if (MyAndroidApp.ProcessCommand(lSubtype) == true) ;
+ else
+ {
+ ErrorOut("Unknown UI Command!!!" + java.lang.Integer.toHexString(lSubtype));
+ };
+ }
+ else if (Buffer == amkJavaLangCall)
+ {
+ DebugOut("amkJavaLangCall");
+ lSubtype = reader.readInt(); // blocking read
+ MyJavaLang.ProcessCommand(lSubtype);
+ }
+// else if (Buffer == amkTimer)
+// {
+// DebugOut("amkTimer");
+// lSubtype = reader.readInt(); // blocking read
+// MyAndroidTimer.ProcessCommand(lSubtype);
+// }
+ else
+ {
+ ErrorOut("Unknown Pascal message!!! " + java.lang.Integer.toHexString(Buffer));
+ }
+ }
+ catch (EOFException e)
+ {
+ ErrorOut("[WaitAndProcessPascalMessage] EOFException=" + e.getMessage());
+ }
+ catch (IOException e)
+ {
+ ErrorOut("[WaitAndProcessPascalMessage] IOException=" + e.getMessage());
+ }
+ }
+
+ // Receiving data
+
+ public byte GetByte()
+ {
+ try
+ {
+ return reader.readByte();
+ }
+ catch (IOException e)
+ {
+ ErrorOut("[GetByte] IOException=" + e.getMessage());
+ }
+ return -1;
+ }
+
+ public int GetInt()
+ {
+ try
+ {
+ return reader.readInt();
+ }
+ catch (IOException e)
+ {
+ ErrorOut("[GetInt] IOException=" + e.getMessage());
+ }
+ return -1;
+ }
+
+ public boolean GetBool()
+ {
+ try
+ {
+ int Tmp = reader.readInt();
+ if (Tmp == 0) return false;
+ else return true;
+ }
+ catch (IOException e)
+ {
+ ErrorOut("[GetBool] IOException=" + e.getMessage());
+ }
+ return false;
+ }
+
+ public float GetFloat()
+ {
+ try
+ {
+ return reader.readFloat();
+ }
+ catch (IOException e)
+ {
+ ErrorOut("[GetFloat] IOException=" + e.getMessage());
+ }
+ return -1;
+ }
+
+ // Sending results
+
+ public void SendResult()
+ {
+ try
+ {
+ writer.writeByte(amkResult);
+ }
+ catch (IOException e)
+ {
+ ErrorOut("[SendResult] IOException=" + e.getMessage());
+ }
+ }
+
+ public void SendIntResult(int Result)
+ {
+ try
+ {
+ writer.writeByte(amkIntResult);
+ writer.writeInt(Result);
+ }
+ catch (IOException e)
+ {
+ ErrorOut("[SendIntResult] IOException=" + e.getMessage());
+ }
+ }
+
+ public void SendFloatResult(float Result)
+ {
+ try
+ {
+ writer.writeByte(amkFloatResult);
+ writer.writeFloat(Result);
+// writer.writeInt(Float.floatToIntBits(Result));
+ }
+ catch (IOException e)
+ {
+ ErrorOut("[SendFloatResult] IOException=" + e.getMessage());
+ }
+ }
+
+ // Sending data
+
+ // Convenience routine, uses SendIntResult
+ public void SendBoolResult(boolean Result)
+ {
+ if (Result == false) SendIntResult(0);
+ else SendIntResult(-1);
+ }
+
+ public void SendInt(int AData)
+ {
+ try
+ {
+ writer.writeInt(AData);
+ }
+ catch (IOException e)
+ {
+ ErrorOut("[SendBoolResult] IOException=" + e.getMessage());
+ }
+ }
+
+ public void SendMessage(byte AMessageKind, int AMessageSubtype)
+ {
+ try
+ {
+ writer.writeByte(AMessageKind);
+ writer.writeInt(AMessageSubtype);
+ }
+ catch (IOException e)
+ {
+ ErrorOut("[SendMessage] IOException=" + e.getMessage());
+ System.exit(0);
+ }
+ }
+
+// String separator = System.getProperty("line.separator");
+/* // Displays a dialog with the result of the operation
+ AlertDialog alertDialog;
+ alertDialog = new AlertDialog.Builder(this).create();
+ alertDialog.setTitle("Result of cp");
+ alertDialog.setMessage(Str + "||" + Str2 + "||" + Str3);
+ alertDialog.show();*/
+ // Waits until it finishes
+// process.waitFor();
+ // Thread.currentThread().sleep(1000);
+}
+
diff --git a/examples/androidlcl/android/src/com/pascal/androidlcl/JavaLang.java b/examples/androidlcl/android/src/com/pascal/androidlcl/JavaLang.java
new file mode 100644
index 000000000..0773ea79a
--- /dev/null
+++ b/examples/androidlcl/android/src/com/pascal/androidlcl/JavaLang.java
@@ -0,0 +1,50 @@
+package com.pascal.androidlcl;
+
+import java.lang.*;
+import java.util.*;
+
+public class JavaLang
+{
+ // info from other classes
+ AndroidPipesComm MyAndroidPipesComm;
+
+ // lists of variables
+ ArrayList LangElements = new ArrayList();
+
+ //
+ static final int amkJavaLang_New_String = 0x0000;
+
+ public JavaLang(AndroidPipesComm AAndroidPipesComm)
+ {
+ MyAndroidPipesComm = AAndroidPipesComm;
+ }
+
+ public void DebugOut(String Str)
+ {
+ MyAndroidPipesComm.DebugOut(Str);
+ }
+
+ public void ProcessCommand(int Buffer)
+ {
+ // DebugOut("");
+ int lInt;
+
+ switch (Buffer)
+ {
+ // java.lang.String
+ // String(char[] data)
+ case amkJavaLang_New_String:
+ DebugOut("amkJavaLang_New_String");
+ lInt = MyAndroidPipesComm.GetInt(); // Length
+ char[] lChars = new char[lInt];
+ for (int i = 0; i < lInt; i++)
+ {
+ lChars[i] = (char) MyAndroidPipesComm.GetByte();
+ }
+ LangElements.add(new String(lChars));
+ MyAndroidPipesComm.SendIntResult(LangElements.size() - 1);
+ break;
+ }
+ }
+}
+
diff --git a/examples/androidlcl/androidlcltest.ico b/examples/androidlcl/androidlcltest.ico
new file mode 100644
index 000000000..0341321b5
Binary files /dev/null and b/examples/androidlcl/androidlcltest.ico differ
diff --git a/examples/androidlcl/androidlcltest.lpi b/examples/androidlcl/androidlcltest.lpi
new file mode 100644
index 000000000..6e7c1dc2e
--- /dev/null
+++ b/examples/androidlcl/androidlcltest.lpi
@@ -0,0 +1,158 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/androidlcl/androidlcltest.lpr b/examples/androidlcl/androidlcltest.lpr
new file mode 100644
index 000000000..91c0832f7
--- /dev/null
+++ b/examples/androidlcl/androidlcltest.lpr
@@ -0,0 +1,20 @@
+program androidlcltest;
+
+{$mode objfpc}{$H+}
+
+uses
+ {$IFDEF UNIX}{$IFDEF UseCThreads}
+ cthreads,
+ {$ENDIF}{$ENDIF}
+ Interfaces, // this includes the LCL widgetset
+ Forms, mainform
+ { you can add units after this };
+
+//{$R *.res}
+
+begin
+ Application.Initialize;
+ Application.CreateForm(TForm2, Form2);
+ Application.Run;
+end.
+
diff --git a/examples/androidlcl/androidlcltest.res b/examples/androidlcl/androidlcltest.res
new file mode 100644
index 000000000..7c6cf3e4b
Binary files /dev/null and b/examples/androidlcl/androidlcltest.res differ
diff --git a/examples/androidlcl/mainform.lfm b/examples/androidlcl/mainform.lfm
new file mode 100644
index 000000000..2db36739e
--- /dev/null
+++ b/examples/androidlcl/mainform.lfm
@@ -0,0 +1,18 @@
+object Form2: TForm2
+ Left = 313
+ Height = 240
+ Top = 186
+ Width = 320
+ Caption = 'Form2'
+ ClientHeight = 240
+ ClientWidth = 320
+ LCLVersion = '0.9.31'
+ object Button1: TButton
+ Left = 33
+ Height = 25
+ Top = 35
+ Width = 75
+ Caption = 'Button1'
+ TabOrder = 0
+ end
+end
diff --git a/examples/androidlcl/mainform.pas b/examples/androidlcl/mainform.pas
new file mode 100644
index 000000000..5c6012897
--- /dev/null
+++ b/examples/androidlcl/mainform.pas
@@ -0,0 +1,32 @@
+unit mainform;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
+ StdCtrls;
+
+type
+
+ { TForm2 }
+
+ TForm2 = class(TForm)
+ Button1: TButton;
+ private
+ { private declarations }
+ public
+ { public declarations }
+ end;
+
+var
+ Form2: TForm2;
+
+implementation
+
+initialization
+ {$I mainform.lrs}
+
+end.
+