Итак, накурившись , до синеватого оттенка формы лица , разных мануалов, в частности Launching activities and handling results in Delphi XE5 Android apps и поморочив голову представителям ембарсадеро Brovin Yaroslav и самое главное используя метод научного втыка начинаем использовать самописный ява код в билдере.
Для начала, пытаемся написать свой ява код.
Сильно грамотные могут это реализовать в обыкновенном блокноте, а особо одаренные, типа меня, качают Android Stidio ну или Eclipse (как настроить еклипс под андроид читаем)
и пишем свой код antareyToast.java
set DX_LIB
set DX_PATH
set Java2Pas
set EMBO_DEX
set javaPath
src\com\dpfaragir\DPFActivity.java ^
Для начала, пытаемся написать свой ява код.
Сильно грамотные могут это реализовать в обыкновенном блокноте, а особо одаренные, типа меня, качают Android Stidio ну или Eclipse (как настроить еклипс под андроид читаем)
- В Android Strudio создаем новый проект
- добавляем новый класс через меню (можно руками в каталоге MyApplication1\app\src\main\java\com\antarey\myapplication1\antareyToast.java)
и пишем свой код antareyToast.java
package com.antarey; import android.content.Context; import android.os.Handler; import android.os.Looper; import android.widget.Toast; public class antareyToast { private Context context; private Handler mHandler = new Handler(Looper.getMainLooper()); private String mMsg; public antareyToast(Context context) { this.context = context; } public void ShowToast(String msg) { mMsg = msg; mHandler.post(new Runnable() { public void run() { Toast.makeText(context, mMsg, Toast.LENGTH_SHORT).show(); } }); } }
- бросаем на форму кнопку
- в MyActivity.java пишем обработчик для кнопки
public void OnButton1Click(View view) { antareyToast an = new antareyToast(this); an.ShowToast("Yra"); }
- Присваиваем кнопке обработчик
Подготавливаем ява код для использования
- Качаем утилиту для получения оберток Java2Pas - она бесплатная, но генерит не весь код, при желании можно купить за 50 европейских бумажек, но смысла нету - все равно надо коррестировать
- В ява коде меняем package com.antarey.myapplication1; на package com.antarey; можно и не менять - но будет меньше структура каталогов
- В РАД Студии создаем новый пустой андроид проект
- Кидаем на форму кнопочку , сохраняемся
- В каталоге проекта создаем каталог Java
cls @echo off echo. echo del old dex if exist if exist .\classes.dex (del .\classes.dex) if exist .\classes.jar (del .\classes.jar) echo. setlocal if x%ANDROID% == x set ANDROID="c:\Users\Public\Documents\Embarcadero\Studio\14.0\PlatformSDKs\adt-bundle-windows-x86-20131030\sdk" set ANDROID_PLATFORM=%ANDROID%\platforms\android-19 set DX_LIB=%ANDROID%\build-tools\19.1.0\lib set DX_PATH=%ANDROID%\build-tools\19.1.0 set Java2Pas=d:\Робота\Программы\Java2Pas set EMBO_DEX="c:\Program Files (x86)\Embarcadero\Studio\14.0\lib\android\debug\classes.dex" set PROJ_DIR=%CD% set VERBOSE=0 set javaPath="c:\Program Files\Java\jdk1.7.0_51\bin" echo. echo Compiling the Java Sources echo. mkdir output 2> nul mkdir output\classes 2> nul if x%VERBOSE% == x1 SET VERBOSE_FLAG=-verbose rem %javaPath%\javac -source 1.6 -target 1.6 %VERBOSE_FLAG% -Xlint:deprecation -cp %ANDROID_PLATFORM%\android.jar -d output\classes src\com\animation\AntareyAnimation.java %javaPath%\javac %VERBOSE_FLAG% -Xlint:deprecation -cp %ANDROID_PLATFORM%\android.jar -d output\classes src\com\antarey\antareyToast.java rem Compiling multiple files rem javac %VERBOSE_FLAG% -Xlint:deprecation -cp %ANDROID_PLATFORM%\android.jar -d output\classes ^ rem src\com\dpfaragir\DPFActivity.java ^ rem src\com\dpfaragir\DPFTextView.java ^ rem src\com\dpfaragir\DPFUtils.java ^ rem src\com\dpfaragir\DPFVideoView.java echo. echo Creating jar containing the new classes echo. mkdir output\jar 2> nul if x%VERBOSE% == x1 SET VERBOSE_FLAG=v %javaPath%\jar c%VERBOSE_FLAG%f output\jar\test_classes.jar -C output\classes com copy output\jar\test_classes.jar .\classes.jar echo. echo Converting from jar to dex... echo. mkdir output\dex 2> nul if x%VERBOSE% == x1 SET VERBOSE_FLAG=--verbose call %DX_LIB%\dx.jar --dex %VERBOSE_FLAG% --output=%PROJ_DIR%\output\dex\test_classes.dex --positions=lines %PROJ_DIR%\output\jar\test_classes.jar echo. echo Merging dex files echo. %javaPath%\java -cp %DX_LIB%\dx.jar com.android.dx.merge.DexMerger %PROJ_DIR%\output\dex\classes.dex %PROJ_DIR%\output\dex\test_classes.dex %EMBO_DEX% echo Finished Merging copy output\dex\classes.dex .\classes.dex %Java2Pas%\Java2Pas.exe .\classes.jar .\ if exist .\classes.jar (del .\classes.jar) rd .\output /s /q
- в батнике проставляем свои пути для
set ANDROID
set ANDROID_PLATFORMset DX_LIB
set DX_PATH
set Java2Pas
set EMBO_DEX
set javaPath
- по тупи java\src\com\antarey\ закидываем свой antareyToast.java
- в строке %javaPath%\javac %VERBOSE_FLAG% -Xlint:deprecation -cp %ANDROID_PLATFORM%\android.jar -d output\classes src\com\antarey\antareyToast.java прописываем путь к своему antareyToast.java , если ява файлов несколько тогда что-то пипа такого
src\com\dpfaragir\DPFActivity.java ^
src\com\dpfaragir\DPFTextView.java ^
src\com\dpfaragir\DPFUtils.java ^
src\com\dpfaragir\DPFVideoView.java
- Запускаем батник на выполнение - в результате получаем :
classes.dex - библиотека, которая предоставляет РАД Студии встроенные ява библиотеки. По сути - батник генерирует ваш декс файл и объденяет его с стандартным classes.dex студии
com.antarey.antareyToast.pas - обертка, которая как раз и дает возможность использовать свой ява код - В студии - Menu->Project->Deployment добавляем свой classes.dex а со стандартного снимаем галочку
О том что в какой секции описывать очень доходчиво описано Как создавать обёртки для JAVA-кода
- в колонке Remote Path своего classes.dex прописываем classes\
- Добавляем к проекту свою обертку com.antarey.antareyToast.pas и приводим ее к божескому виду
unit com.antarey.antareyToast; interface uses FMX.Helpers.Android, Androidapi.Helpers, AndroidAPI.JNIBridge, Androidapi.JNI.JavaTypes, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.os; type JantareyToast = interface; JantareyToastClass = interface(JObjectClass) ['{C4BED43A-7A25-43F2-A9BE-B2E1602FB2D8}'] function init(JContextparam0 : JContext) : JantareyToast; cdecl; end; [JavaSignature('com/antarey/antareyToast')] JantareyToast = interface(JObject) ['{5AFABA34-5223-424D-A381-5F61E4B67B53}'] procedure ShowToast(JStringparam0 : JString) ; cdecl; end; TJantareyToast = class(TJavaGenericImport<JantareyToastClass, JantareyToast>) end; procedure ShowToast(ToastMsg: String); implementation procedure ShowToast(ToastMsg: String); var Activity:JantareyToast; begin Activity:= TJantareyToast.JavaClass.init(SharedActivityContext); Activity.ShowToast(StringToJString(ToastMsg)); end; procedure RegisterTypes; begin TRegTypes.RegisterType('com.antarey.antareyToast',TypeInfo(com.antarey.antareyToast.JantareyToast)); end; initialization RegisterTypes; end.
- в Unit1.cpp добавляем ссылку на нашу обертку
#include <com.antarey.antareyToast.hpp>
- пишем обработчик для кнопочки
//--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { ShowToast( UnicodeString(_D("Ура!!!! - Получилось")) ); } //---------------------------------------------------------------------------
В итоге получаем
//--------------------------------------------------------------------------- #include <fmx.h> #pragma hdrstop #include "Unit1.h" #include <com.antarey.antareyToast.hpp> //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.fmx" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { ShowToast( UnicodeString(_D("Ура!!!! - Получилось")) ); } //---------------------------------------------------------------------------
- в менеджере проекта выбираем где будем тестить свое творение
Приобретаем естественный цвет лица и думаем че б еще сварганить.
Есть уже готовые обертки для всего АПИ Full Android SDK Interface Files In Object Pascal For Firemonkey , но они сгенерированы на автомате и надо перепроверять
Есть уже готовые обертки для всего АПИ Full Android SDK Interface Files In Object Pascal For Firemonkey , но они сгенерированы на автомате и надо перепроверять
Вроде как-то так
Есть ли возможность из Java-кода получить доступ к Context, чтоб не передавать его через TJantareyToast.JavaClass.init(SharedActivityContext)?
ОтветитьУдалитьThe Best Casinos in USA - APRCasino
ОтветитьУдалитьIt is one of the most well-known casino 1등 사이트 casinos, aprcasino and it is owned worrione.com and operated by the Rincon https://octcasino.com/ Band of Luiseno Indians. There are over 100 different