вторник, 8 июля 2014 г.

Использование своего Ява кода в C++Builder XE6

Итак, накурившись , до синеватого оттенка формы лица , разных мануалов,  в частности Launching activities and handling results in Delphi XE5 Android apps и поморочив голову представителям ембарсадеро Brovin Yaroslav  и самое главное используя метод научного втыка начинаем использовать самописный ява код в билдере.



Для начала, пытаемся написать свой ява код.
Сильно грамотные могут это реализовать в обыкновенном блокноте, а особо одаренные, типа меня, качают 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");
}


  • Присваиваем кнопке обработчик
  • Запускаем по Shift+F10 и наслаждаемся результатом

Думали все... а это только легкая часть


Подготавливаем ява код для использования
  • Качаем утилиту для получения оберток Java2Pas  - она бесплатная, но генерит не весь код, при желании можно купить за 50 европейских бумажек, но смысла нету - все равно надо коррестировать 
  • В ява коде меняем package com.antarey.myapplication1; на package com.antarey; можно и не менять - но будет меньше структура каталогов
  • В РАД Студии создаем новый пустой андроид проект
  • Кидаем на форму кнопочку , сохраняемся
  • В каталоге проекта создаем каталог Java
В каталоге 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_PLATFORM
set 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 , если ява файлов несколько тогда что-то пипа такого
javac %VERBOSE_FLAG% -Xlint:deprecation -cp %ANDROID_PLATFORM%\android.jar -d output\classes ^
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 - обертка, которая как раз и дает возможность использовать свой ява код
  • О том что в какой секции описывать очень доходчиво описано Как создавать обёртки для JAVA-кода
  • В студии - Menu->Project->Deployment добавляем свой classes.dex а со стандартного снимаем галочку

  • в колонке 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 , но они сгенерированы на автомате и надо перепроверять


    Вроде как-то так


    2 комментария:

    1. Есть ли возможность из Java-кода получить доступ к Context, чтоб не передавать его через TJantareyToast.JavaClass.init(SharedActivityContext)?

      ОтветитьУдалить
    2. 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

      ОтветитьУдалить