antarey Опубликовано 10 апреля, 2014 Поделиться Опубликовано 10 апреля, 2014 Подскажите как в C++Builder использовать ява код Спасибо Цитата Ссылка на комментарий
0 Kitty Опубликовано 29 апреля, 2014 Поделиться Опубликовано 29 апреля, 2014 Может кому пригодиться. Использование 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); } Nix0N и Brovin Yaroslav 2 Цитата Ссылка на комментарий
0 antarey Опубликовано 29 апреля, 2014 Автор Поделиться Опубликовано 29 апреля, 2014 Kitty и на етом спасибо. Хотя меня больше интересует вариант - я сам написал ява код - как его использовать в билдере?? Цитата Ссылка на комментарий
0 antarey Опубликовано 26 июня, 2014 Автор Поделиться Опубликовано 26 июня, 2014 Перерыл много форумов но так толком ничего и не нашел . Я написал ява код используя класс Animation для реализации анимации слайда и 3D вращения. Код проверил на Android Studio - работает Скомпилировал свой dex и объединил его с classes.dex студии - забросил в деплоймент Это было самое легкое. Дальше в упор не могу понять - и найти статьи о том как использовать свои ява процедуры Буду всем очень признателен за помощь Когда разберусь с подключением ява кода - думаю можно будет организовать что-то типа копилки реализации анимаций. Со слайдами и 3д переворотом вроде разобрался - на очереди folding но с ним пока проблемы - как его юзать в Android Studio разобрался - а вот как сделать код пригодным для студии пока нет Ярослав , очень сильно надеюсь на Вашу помощь - статей/примеров для С++ вообще нету - даже не знаю с чего начать Всем заранее спасибо Цитата Ссылка на комментарий
0 SVTX Опубликовано 27 июня, 2014 Поделиться Опубликовано 27 июня, 2014 Перерыл много форумов но так толком ничего и не нашел . Я написал ява код используя класс Animation для реализации анимации слайда и 3D вращения. Код проверил на Android Studio - работает Скомпилировал свой dex и объединил его с classes.dex студии - забросил в деплоймент Это было самое легкое. Дальше в упор не могу понять - и найти статьи о том как использовать свои ява процедуры Буду всем очень признателен за помощь Когда разберусь с подключением ява кода - думаю можно будет организовать что-то типа копилки реализации анимаций. Со слайдами и 3д переворотом вроде разобрался - на очереди folding но с ним пока проблемы - как его юзать в Android Studio разобрался - а вот как сделать код пригодным для студии пока нет Ярослав , очень сильно надеюсь на Вашу помощь - статей/примеров для С++ вообще нету - даже не знаю с чего начать Всем заранее спасибо Делал похожее. Вызывал жавовскую часть обьединенную с classes.dex либо через BroadcastReceiver по примеру из Blong Blong (поищите в сети) либо через второй Activity полностью написанный на java и задекларированный в манифесте, но прямой взаимосвязи с делфи-активити там нет, хотя можно было сделать через тотже BroadcastReceiver. В общем так чтобы прямо в лоб не получилось). А вопрос очень хороший). Цитата Ссылка на комментарий
0 antarey Опубликовано 2 июля, 2014 Автор Поделиться Опубликовано 2 июля, 2014 Ладно, как написать ява обертку на С++ пока отложим и пойдем другим путем. Если писать обертку для ява кода на делфи и подключить ее к С++ - возникает два вопроса: 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 Модераторы Andrey Efimov Опубликовано 2 июля, 2014 Модераторы Поделиться Опубликовано 2 июля, 2014 По первому пункту: Цифры(GUID) берутся рандомно, необходимы для RAD Studio, для генерации используйте комбинацию клавиш "Ctrl+Shift+G" Brovin Yaroslav 1 Цитата Ссылка на комментарий
0 antarey Опубликовано 2 июля, 2014 Автор Поделиться Опубликовано 2 июля, 2014 Andrey Yefimov, с первым вопросом ясно спасибо Цитата Ссылка на комментарий
0 antarey Опубликовано 4 июля, 2014 Автор Поделиться Опубликовано 4 июля, 2014 Так, вот мои мучения Ява код - на андроид студии работает 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. все компилируется - запускается - но не кликается - вот что получаю и Где я напортачил?? Цитата Ссылка на комментарий
0 Администраторы Brovin Yaroslav Опубликовано 7 июля, 2014 Администраторы Поделиться Опубликовано 7 июля, 2014 Для начала нужно понять, что вы имеете в виду тут: procedure Rotate3D(); begin CallInUIThread( procedure() begin Rotate3D(); end); end; Это бесконечная рекурсия с запуском в UI потоке. Вообще в коде не вижу, как вы вызываете ваш java код. Цитата Ссылка на комментарий
0 antarey Опубликовано 7 июля, 2014 Автор Поделиться Опубликовано 7 июля, 2014 сам не вижу, у меня обертка еще не доделана вот вызов 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 antarey Опубликовано 7 июля, 2014 Автор Поделиться Опубликовано 7 июля, 2014 По вашему п.№2 вызов var Animation: JAntareyAnimation; begin Animation := TJAntareyAnimation.Create; Animation.Rotate3D; end; или не верный вызов или обертка ошибка в Animation.Rotate3D; Цитата Ссылка на комментарий
0 Администраторы Brovin Yaroslav Опубликовано 7 июля, 2014 Администраторы Поделиться Опубликовано 7 июля, 2014 И правильно, у вас в разных местах путь к вашему Java классу по разному написан. В одном случае это: com.antareyanimation В другом почему-то: com/antarey/AntareyAnimation Почистите код и внимательно все проверьте. У вас целая куча неряшливого кода, в котором вы просто погрязните. Цитата Ссылка на комментарий
0 antarey Опубликовано 7 июля, 2014 Автор Поделиться Опубликовано 7 июля, 2014 Да ето я уже исправил. Просто не совсем понятно в обертке что прописывать в 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 antarey Опубликовано 7 июля, 2014 Автор Поделиться Опубликовано 7 июля, 2014 вот все сначала, с исправлениями ява 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 antarey Опубликовано 8 июля, 2014 Автор Поделиться Опубликовано 8 июля, 2014 Итак, вот результат моих потуг 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("Ура!!!! - Получилось")) ); } //--------------------------------------------------------------------------- Все работает. Более подробно читаем тут Но ето только один из методов, использовать стандартные библиотеки немного проще, проще в том что не надо писать ява код самому, а обертки есть уже готовые Andrey Efimov, Kitty и Brovin Yaroslav 3 Цитата Ссылка на комментарий
0 Женя Опубликовано 27 февраля, 2019 Поделиться Опубликовано 27 февраля, 2019 В 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 Женя Опубликовано 27 февраля, 2019 Поделиться Опубликовано 27 февраля, 2019 В 10.04.2014 в 09:29, antarey сказал: Подскажите как в C++Builder использовать ява код Спасибо ПОДСКАЗАЛИ? если джа-то теперь мне расскажи-что да как! Цитата Ссылка на комментарий
Вопрос
antarey
Подскажите как в C++Builder использовать ява код
Спасибо
Ссылка на комментарий
17 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.