Как использовать Intent для С++?
У меня "Rad Studio 10.1 Berlin Update 2". Я пытался воссоздать код Delphi в C ++.
Delphi: (Unit1.pas)
unit Unit1;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
FMX.Controls.Presentation, FMX.StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
//------------------------------------------------------------
uses
Androidapi.JNI.JavaTypes, Androidapi.JNI.App, Androidapi.Helpers,
Androidapi.JNI.GraphicsContentViewText;
//------------------------------------------------------------
function getTimeAfterInSecs(Seconds: Integer): Int64;
var
Calendar: JCalendar;
begin
Calendar := TJCalendar.JavaClass.getInstance;
Calendar.add(TJCalendar.JavaClass.SECOND, Seconds);
Result := Calendar.getTimeInMillis;
end;
//------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
var
Intent: JIntent;
PendingIntent: JPendingIntent;
begin
// Создаём Интент
Intent := TJIntent.Create;
Intent.setClassName(TAndroidHelper.Context, StringToJString('com.embarcadero.firemonkey.FMXNativeActivity'));
// Оборачиваем Интент в PendingIntent
PendingIntent := TJPendingIntent.JavaClass.getActivity(TAndroidHelper.Context, 1, Intent, 0);
// Устанавливаем оповещение
TAndroidHelper.AlarmManager.&set(TJAlarmManager.JavaClass.RTC_WAKEUP, getTimeAfterInSecs(30),
PendingIntent);
TimeService.Close;
end;
//------------------------------------------------------------
end.
C++ (Unit1.h)
//------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <System.SysUtils.hpp>
#include <System.Types.hpp>
#include <System.UITypes.hpp>
#include <System.Variants.hpp>
#include <FMX.Controls.hpp>
#include <FMX.Forms.hpp>
#include <FMX.Controls.Presentation.hpp>
#include <FMX.StdCtrls.hpp>
#include <FMX.Types.hpp>
#include <FMX.Graphics.hpp>
#include <FMX.Dialogs.hpp>
#include <Androidapi.JNI.JavaTypes.hpp>
#include <Androidapi.JNI.App.hpp>
#include <Androidapi.Helpers.hpp>
#include <Androidapi.JNI.GraphicsContentViewText.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
void __fastcall Button1Click(TObject *Sender);
private: // User declarations
int __fastcall getTimeAfterInSecs(int seconds);
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
C++ (Unit1.cpp):
//------------------------------------------------------------------------
#include <fmx.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.fmx"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
int __fastcall TForm1::getTimeAfterInSecs(int seconds)
{
int result = 0;
_di_JCalendar calendar; // or: JCalendar *calendar;
calendar = TJCalendar::JavaClass->getInstance();
calendar->add(TJCalendar::JavaClass->SECOND, seconds);
result = calendar->getTimeInMillis();
return result;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
_di_JIntent intent; // or: JIntent *intent;
intent = new TJIntent; // or: intent = TJIntent::Create();
// or: intent = TJIntent::JavaClass->init();
_di_JPendingIntent pendingIntent; // or: JPendingIntent *pendingIntent;
intent->setClassName(TAndroidHelper::Context, StringToJString("com.embarcadero.firemonkey.FMXNativeActivity"));
pendingIntent = TJPendingIntent::JavaClass->getActivity(TAndroidHelper::Context, 1, intent, 0);
TAndroidHelper::AlarmManager->set(TJAlarmManager::JavaClass->RTC_WAKEUP, getTimeAfterInSecs(30), pendingIntent);
}
//---------------------------------------------------------------------------
Получаю ошибку на строке:
_di_JIntent intent;
intent = new TJIntent;
Ошибка:
[bccaarm Error] Unit1.cpp(30): no viable overloaded '='
systobj.h(312): candidate function not viable: no known conversion from 'Androidapi::Jni::Graphicscontentviewtext::TJIntent *' to 'const DelphiInterface<Androidapi::Jni::Graphicscontentviewtext::JIntent>' for 1st argument
systobj.h(329): candidate function not viable: no known conversion from 'Androidapi::Jni::Graphicscontentviewtext::TJIntent *' to 'Androidapi::Jni::Graphicscontentviewtext::JIntent *' for 1st argument
systobj.h(303): candidate template ignored: could not match 'DelphiInterface<type-parameter-0-0>' against 'Androidapi::Jni::Graphicscontentviewtext::TJIntent *'
Если заменить
_di_JIntent intent;
intent = new TJIntent;
на
JIntent *intent;
intent = TJIntent::Create();
программа запускается, но при нажатии на Button1 вылетает Access Violation.
Пока что удалось решить задачу следуюущим образом. Создал проект, добавил Delphi Unit2.pas. Сгенерированный Unit2.hpp включиль в Unit1.cpp. Приложу файлы.
Unit1.h
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <System.SysUtils.hpp>
#include <System.Types.hpp>
#include <System.UITypes.hpp>
#include <System.Variants.hpp>
#include <FMX.Controls.hpp>
#include <FMX.Forms.hpp>
#include <FMX.Controls.Presentation.hpp>
#include <FMX.StdCtrls.hpp>
#include <FMX.Types.hpp>
#include <FMX.Graphics.hpp>
#include <FMX.Dialogs.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
void __fastcall Button1Click(TObject *Sender);
private: // User declarations
public: // User declarations
__int64 sec;
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Unit1.cpp
//---------------------------------------------------------------------------
#include <fmx.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.hpp"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.fmx"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
sec = 10;
IsTm = sec;
IsTime();
Form1->Close();
}
//---------------------------------------------------------------------------
Unit2.pas
unit Unit2;
interface
var
IsTm: Int64;
function getTimeAfterInSecs(Seconds: Integer): Int64;
procedure IsTime();
implementation
uses
Androidapi.JNI.JavaTypes, Androidapi.JNI.App, Androidapi.Helpers,
Androidapi.JNI.GraphicsContentViewText;
function getTimeAfterInSecs(Seconds: Integer): Int64;
var
Calendar: JCalendar;
begin
Calendar := TJCalendar.JavaClass.getInstance;
Calendar.add(TJCalendar.JavaClass.SECOND, Seconds);
Result := Calendar.getTimeInMillis;
end;
procedure IsTime();
var
Intent: JIntent;
PendingIntent: JPendingIntent;
begin
Intent := TJIntent.Create;
Intent.setClassName(TAndroidHelper.Context, StringToJString('com.embarcadero.firemonkey.FMXNativeActivity'));
PendingIntent := TJPendingIntent.JavaClass.getActivity(TAndroidHelper.Context, 1, Intent, 0);
TAndroidHelper.AlarmManager.&set(TJAlarmManager.JavaClass.RTC_WAKEUP, getTimeAfterInSecs(IsTm), PendingIntent);
end;
end.
Unit2.hpp
// CodeGear C++Builder
// Copyright (c) 1995, 2016 by Embarcadero Technologies, Inc.
// All rights reserved
// (DO NOT EDIT: machine generated header) 'Unit2.pas' rev: 31.00 (Android)
#ifndef Unit2HPP
#define Unit2HPP
#pragma delphiheader begin
#pragma option push
#pragma option -w- // All warnings off
#pragma option -Vx // Zero-length empty class member
#pragma pack(push,8)
#include <System.hpp>
#include <SysInit.hpp>
//-- user supplied -----------------------------------------------------------
namespace Unit2
{
//-- forward type declarations -----------------------------------------------
//-- type declarations -------------------------------------------------------
//-- var, const, procedure ---------------------------------------------------
extern DELPHI_PACKAGE __int64 IsTm;
extern DELPHI_PACKAGE __int64 __fastcall getTimeAfterInSecs(int Seconds);
extern DELPHI_PACKAGE void __fastcall IsTime(void);
} /* namespace Unit2 */
#if !defined(DELPHIHEADER_NO_IMPLICIT_NAMESPACE_USE) && !defined(NO_USING_NAMESPACE_UNIT2)
using namespace Unit2;
#endif
#pragma pack(pop)
#pragma option pop
#pragma delphiheader end.
//-- end unit ----------------------------------------------------------------
#endif // Unit2HPP
Может кому то это поможет, но хотелось бы решить проблему на C++. Надеюсь кто нибудь поможеть.