• 0
antarey

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

Вопросы

Подскажите как в C++Builder использовать ява код

Спасибо

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

17 ответов на этот вопрос

  • 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

Kitty и на етом спасибо. Хотя меня больше интересует вариант - я сам написал ява код - как его использовать в билдере??

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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

По первому пункту: Цифры(GUID) берутся рандомно, необходимы для RAD Studio, для генерации используйте комбинацию клавиш "Ctrl+Shift+G"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Andrey Yefimov, с первым вопросом ясно :) спасибо

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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

По вашему п.№2

вызов 

var
  Animation: JAntareyAnimation;
begin
  Animation := TJAntareyAnimation.Create;
  Animation.Rotate3D;
end;

или не верный вызов или обертка

ошибка в 

Animation.Rotate3D;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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);

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 10.04.2014 в 09:29, antarey сказал:

Подскажите как в C++Builder использовать ява код

Спасибо

ПОДСКАЗАЛИ?  если джа-то теперь мне  расскажи-что да как! 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

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

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