Как использовать 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++. Надеюсь кто нибудь поможеть.


Ответы (0 шт):