Перейти к содержанию
Fire Monkey от А до Я
  • 0

Как в Firemonkey на C++Builder использовать ява код?


antarey

Вопрос

Рекомендуемые сообщения

  • 0

Может кому пригодиться. Использование java классов JIntent и JNet_Uri. Спасибо разработчику Indy Remy Lebeau (TeamB)

http://bcbjournal.org/forums/

void PlayVideo(const String AFileName)
{
	_di_JIntent Intent = TJIntent::JavaClass->init(TJIntent::JavaClass->ACTION_VIEW);
	_di_Jnet_Uri Data = StrToJURI(AFileName);
	Intent->setDataAndType(Data, StringToJString(L"video/mp4"));
	SharedActivity()->startActivity(Intent);
 
}
Ссылка на комментарий
  • 0

Перерыл много форумов но так толком ничего и не нашел .

 

Я написал ява код используя класс Animation для реализации анимации слайда и 3D вращения. Код проверил на Android Studio - работает :)

Скомпилировал свой dex и объединил его с classes.dex студии - забросил в деплоймент

Это было самое легкое.

Дальше в упор не могу понять - и найти статьи о том как использовать свои ява процедуры

Буду всем очень признателен за помощь

Когда разберусь с подключением ява кода - думаю можно будет организовать что-то типа копилки реализации анимаций. Со слайдами и 3д переворотом вроде разобрался - на очереди  folding но с ним пока проблемы - как его юзать в Android Studio разобрался - а вот как сделать код пригодным для студии пока нет

 

Ярослав , очень сильно надеюсь на Вашу помощь - статей/примеров для С++ вообще нету - даже не знаю с чего начать

Всем заранее спасибо

Ссылка на комментарий
  • 0

Перерыл много форумов но так толком ничего и не нашел .

 

Я написал ява код используя класс Animation для реализации анимации слайда и 3D вращения. Код проверил на Android Studio - работает :)

Скомпилировал свой dex и объединил его с classes.dex студии - забросил в деплоймент

Это было самое легкое.

Дальше в упор не могу понять - и найти статьи о том как использовать свои ява процедуры

Буду всем очень признателен за помощь

Когда разберусь с подключением ява кода - думаю можно будет организовать что-то типа копилки реализации анимаций. Со слайдами и 3д переворотом вроде разобрался - на очереди  folding но с ним пока проблемы - как его юзать в Android Studio разобрался - а вот как сделать код пригодным для студии пока нет

 

Ярослав , очень сильно надеюсь на Вашу помощь - статей/примеров для С++ вообще нету - даже не знаю с чего начать

Всем заранее спасибо

Делал похожее. Вызывал жавовскую часть обьединенную с classes.dex либо через BroadcastReceiver по примеру из Blong Blong (поищите в сети) либо через второй Activity полностью написанный на java и задекларированный в манифесте, но прямой взаимосвязи с делфи-активити там нет, хотя можно было сделать через тотже BroadcastReceiver. В общем так чтобы прямо в лоб не получилось). А вопрос очень хороший).

Ссылка на комментарий
  • 0

Ладно, как написать ява обертку на С++ пока отложим и пойдем другим путем.

Если писать обертку для ява кода на делфи и подключить ее к С++ - возникает два вопроса:

1. откуда брать циферки/буковки ?

= interface( JObjectClass )
    ['{F645A7A7-3737-4F4E-8848-9C54FBA00284}']

2. в обертке надо описывать не только свой класс но и все классы импорта в ява кода ?

import android.graphics.Bitmap;
import android.graphics.Camera;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Shader;
import android.os.Build;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.Transformation;

Ярослав, просьба не пинать за возможное нарушения правил о двух вопросах в одном посте - они неотъемлемая часть моего вопроса

Спасибо 

 

Ссылка на комментарий
  • 0

Так, вот мои мучения

Ява код - на андроид студии работает 100%

package com.antareyanimation;
import android.content.Context;
import android.widget.Toast;

public class AntareyAnimation {
    private Context context;
    public AntareyAnimation(Context context){
        this.context=context;
    }

    public void Rotate3D()
    {
        Toast zxczx = Toast.makeText(context, "Привет", Toast.LENGTH_SHORT);
    }
}

вот батник для получения декс

 

cls
@echo off


echo.
echo del old dex if exist
if exist .\classes.dex (del .\classes.dex)
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 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
%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 
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


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
rd .\output /s /q

вот обертка для ява кода

 

unit Antarey.Android.JAnimation;


interface


uses
  Androidapi.JNI.GraphicsContentViewText,
  FMX.Platform.Android,
  FMX.Helpers.Android,
  FMX.Controls,
  Androidapi.JNIBridge,
  Androidapi.JNI.JavaTypes;


{$IFDEF ANDROID}


type

  JAntareyAnimation = interface;
  // ----------------------------------------------------------------------------
  // JAntareyAnimation
  // ----------------------------------------------------------------------------
  JAntareyAnimationClass = interface(JObjectClass)
    ['{3FC48462-87FD-4F6C-9B15-02BC09D67168}']
    function init(context: JContext): JAntareyAnimation; cdecl;
  end;

  [JavaSignature('com/animation/AntareyAnimation')]
  JAntareyAnimation = interface(JObject)
    ['{38A1F738-CDE7-46F6-AA07-5A453A3AC0B2}']
    procedure Rotate3D(); cdecl;
  end;

  TAntareyAnimation = class(TJavaGenericImport<JAntareyAnimationClass,
    JAntareyAnimation>)
  end;


procedure Rotate3D();

{$ENDIF}

implementation

{$IFDEF ANDROID}

procedure Rotate3D();
begin
  CallInUIThread(
    procedure()
    begin
      Rotate3D();
    end);
end;
{$ENDIF}

end.

ну и сама програмулина

unit _frmMainPas;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes,
  System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Objects,
  Antarey.Android.JAnimation,
  FMX.Helpers.Android, FMX.StdCtrls;

type
  TfrmMainPas = class(TForm)
    Button1: TButton;
    Image1: TImage;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmMainPas: TfrmMainPas;

implementation

{$R *.fmx}

procedure TfrmMainPas.Button1Click(Sender: TObject);
begin
  Rotate3D();
end;

end.

все компилируется - запускается :) - но не кликается :( - вот что получаю

 

post-49-0-42789100-1404479104_thumb.png

и

post-49-0-70402300-1404479109_thumb.png

 

Где я напортачил??

Ссылка на комментарий
  • 0
  • Администраторы

Для начала нужно понять, что вы имеете в виду тут:

procedure Rotate3D();
begin
  CallInUIThread(
    procedure()
    begin
      Rotate3D();
    end);
end;

Это бесконечная рекурсия с запуском в UI потоке. Вообще в коде не вижу, как вы вызываете ваш java код. 

Ссылка на комментарий
  • 0

:) сам не вижу, у меня обертка еще не доделана

вот вызов

procedure TfrmMainPas.Button1Click(Sender: TObject);
begin
  Rotate3D();
end;

end.

Вот переделанная обертка с Вашими рекомендациями , но так понимаю еще не доделанная,

unit com.antarey.AntareyAnimation;


interface


uses
  AndroidAPI.JNIBridge,
  Androidapi.JNI.JavaTypes,
  Androidapi.JNI.GraphicsContentViewText;


type
  JAntareyAnimation = interface;


  JAntareyAnimationClass = interface(JObjectClass)
    ['{2B5A2F93-3AA1-4415-9AB4-033A08EDE51A}']
    function init(JContextparam0 : JContext) : JAntareyAnimation; cdecl;        // (Landroid/content/Context;)V A: $1
    procedure Rotate3D ; cdecl;                                                 // ()V A: $1
  end;


  [JavaSignature('com/antarey/AntareyAnimation')]
  JAntareyAnimation = interface(JObject)
    ['{9F7DE253-EBD7-4D7C-B058-D803C7CCBF2F}']
  end;


  TJAntareyAnimation = class(TJavaGenericImport<JAntareyAnimationClass, JAntareyAnimation>)
  end;


implementation
procedure Rotate3D();
begin
//  CallInUIThread(
//    procedure()
//    begin


      Rotate3D();
//    end);
end;




procedure RegisterTypes;
begin
  TRegTypes.RegisterType('com.antarey.AntareyAnimation', TypeInfo(com.antarey.AntareyAnimation.JAntareyAnimation));
end;


initialization
  RegisterTypes;




end.

 плюс проблемы с вызовом

 

procedure TForm1.Button1Click(Sender: TObject);
begin
com.antarey.AntareyAnimation.TJAntareyAnimation.JavaClass.Rotate3D;
end;

но скорее всего ето не правильно

Ссылка на комментарий
  • 0
  • Администраторы

И правильно, у вас в разных местах путь к вашему Java классу по разному написан. 

  1. В одном случае это: com.antareyanimation
  2. В другом почему-то: com/antarey/AntareyAnimation

Почистите код и внимательно все проверьте. У вас целая куча неряшливого кода, в котором вы просто погрязните.

Ссылка на комментарий
  • 0

Да ето я уже исправил.

Просто не совсем понятно в обертке

что прописывать в 

  JAntareyAnimationClass = interface(JObjectClass)
    ['{2B5A2F93-3AA1-4415-9AB4-033A08EDE51A}']
    function init(JContextparam0 : JContext) : JAntareyAnimation; cdecl;     
    procedure Rotate3D ; cdecl;  
  end;

а что в

 
  [JavaSignature('com/antarey/AntareyAnimation')]
  JAntareyAnimation = interface(JObject)
    ['{9F7DE253-EBD7-4D7C-B058-D803C7CCBF2F}']
  end;

а если точнее , то где именно объявить мою ява процедуру Rotate3D

Ссылка на комментарий
  • 0

вот все сначала, с исправлениями

ява

AntareyAnimation.java

package com.antarey;

import android.content.Context;
import android.widget.Toast;

public class AntareyAnimation {
    private Context context;
    public AntareyAnimation(Context context){
        this.context=context;
    }
    public void Rotate3D()
    {
      Toast zxczx = Toast.makeText(context, "Привет", Toast.LENGTH_SHORT);
    }
}

вот обертка

unit com.antarey.AntareyAnimation;


interface


uses
  AndroidAPI.JNIBridge,
  AndroidAPI.JNI.JavaTypes,
  AndroidAPI.JNI.GraphicsContentViewText;


type
  JAntareyAnimation = interface;


  JAntareyAnimationClass = interface(JObjectClass)
    ['{1E982F9C-B857-44C1-BCCF-383C25E2CDD1}']
    function init(JContextparam0: JContext): JAntareyAnimation; cdecl;
    // (Landroid/content/Context;)V A: $1
    procedure Rotate3D; cdecl; // ()V A: $1
  end;


  [JavaSignature('com/antarey/AntareyAnimation')]
  JAntareyAnimation = interface(JObject)
    ['{57391557-8D42-4A20-8B2C-F67157CE6899}']
    procedure Rotate3D; cdecl; // ()V A: $1
  end;


  TJAntareyAnimation = class(TJavaGenericImport<JAntareyAnimationClass,
    JAntareyAnimation>)
  end;


implementation


procedure RegisterTypes;
begin
  TRegTypes.RegisterType('com.antarey.AntareyAnimation',
    TypeInfo(com.antarey.AntareyAnimation.JAntareyAnimation));
end;




initialization


RegisterTypes;


end.

вот вызов

 

procedure TForm1.Button1Click(Sender: TObject);
var
Animation: JAntareyAnimation;
begin
com.antarey.AntareyAnimation.TJAntareyAnimation.JavaClass.init(MainActivity);
  Animation := TJAntareyAnimation.Create;
  Animation.Rotate3D;
end;

На устройстве - access violation ????

Ссылка на комментарий
  • 0

Итак, вот результат моих потуг

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();
            }
        });
    }
}

обертка 

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.

вызов

 

//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ShowToast( UnicodeString(_D("Ура!!!! - Получилось")) );
}
//---------------------------------------------------------------------------

Все работает.

Более подробно читаем тут

Но ето только один из методов, использовать стандартные библиотеки немного проще, проще в том что не надо писать ява код самому, а обертки есть уже готовые

Ссылка на комментарий
  • 0
В 29.04.2014 в 17:05, Kitty сказал:

Может кому пригодиться. Использование java классов JIntent и JNet_Uri. Спасибо разработчику Indy Remy Lebeau (TeamB)

http://bcbjournal.org/forums/


void PlayVideo(const String AFileName)
{
	_di_JIntent Intent = TJIntent::JavaClass->init(TJIntent::JavaClass->ACTION_VIEW);
	_di_Jnet_Uri Data = StrToJURI(AFileName);
	Intent->setDataAndType(Data, StringToJString(L"video/mp4"));
	SharedActivity()->startActivity(Intent);
 
}

И КУДА ЭТОТ КОД ВТЫКАТЬ? Я ТОЛЬКО УЧУСЬ,И НЕ ПОЙМУ! ВОТКНУЛ Я ЭТОТ КОД  ВОТ ТАК-

#include <fmx.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.fmx"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
               void PlayVideo(const String AFileName)
{
    _di_JIntent Intent = TJIntent::JavaClass->init(TJIntent::JavaClass->ACTION_VIEW);
    _di_Jnet_Uri Data = StrToJURI(AFileName);
    Intent->setDataAndType(Data, StringToJString(L"video/mp4"));
    SharedActivity()->startActivity(Intent);

}
}--- И КАКОЙ ТОЛК?

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...