Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Android: Klasse aus .jar benutzen (https://www.delphipraxis.net/215553-android-klasse-aus-jar-benutzen.html)

bcvs 26. Jul 2024 11:28

Android: Klasse aus .jar benutzen
 
Hallo zusammen, ich habe muss .jar-Datei in meine App einbinden. Zunächst habe ich dieses Bridge-File erzeugt und die .jar als Bibliothek eingebunden, wie hier beschrieben:
http://docwiki.embarcadero.com/RADSt...o_Android_Apps

So weit, so gut.

Jetzt geht es darum die Klassen zu verwenden. Ich will zunächst mal die function isNfcEnabled aufrufen. Die entsprechende Klasse ist in der Bridge-Datei so definiert:

Delphi-Quellcode:
  JCardlinkClass = interface(JICardlinkCallbackClass)
    ['{62BD9E24-88F0-4FD3-BD57-65479E39241E}']
    {class} function _GetINSTANCE: JCardlink; cdecl;
    {class} function getDebug: Boolean; cdecl;
    {class} function getLogLevel: JLogLevel; cdecl;
    {class} function getSmsHack: Boolean; cdecl;
    {class} function getState: JCardlinkState; cdecl;
    {class} procedure initialize(string_: JString; iCardlinkCallback: JICardlinkCallback; string_1: JString; string_2: JString); cdecl;
    {class} function isNfcEnabled(context: JContext): Boolean; cdecl;
    {class} function isNfcHardwareAvailable(context: JContext): Boolean; cdecl;
    {class} procedure requestSmsToken(string_: JString; string_1: JString; string_2: JString; string_3: JString); cdecl;
    {class} procedure setDebug(b: Boolean); cdecl;
    {class} procedure setLogLevel(logLevel: JLogLevel); cdecl;
    {class} procedure setSmsHack(b: Boolean); cdecl;
    {class} procedure shutdown; cdecl;
    {class} procedure startScan(string_: JString; activity: JActivity); cdecl;
    {class} procedure verifySmsToken(string_: JString); cdecl;
    {class} property INSTANCE: JCardlink read _GetINSTANCE;
  end;

  [JavaSignature('de/...../Cardlink')]
  JCardlink = interface(JICardlinkCallback)
    ['{46B08D27-AA20-4A0D-971E-7405E46E0787}']
    procedure onError(cardlinkError: JCardlinkError; string_: JString; cardlinkAction: JCardlinkAction); cdecl;
    procedure onPrescriptionBundles(list: JList); cdecl;
    procedure onPrescriptionTokens(string_: JString); cdecl;
    procedure onProgressUpdate(i: Integer); cdecl;
    procedure onStateChanged(cardlinkState: JCardlinkState); cdecl;
  end;
  TJCardlink = class(TJavaGenericImport<JCardlinkClass, JCardlink>) end;
Ich denke, ich muss jetzt eine Instanz von JCardlink erzeugen mit

Delphi-Quellcode:
var CardLink: JCardlink;
CardLink:=TJCardlink.JavaClass.INSTANCE;
Aber wie komme ich von da an die function isNfcEnabled? Die steckt doch in dem interface JCardlinkClass

Olli73 26. Jul 2024 15:42

AW: Android: Klasse aus .jar benutzen
 
Davon habe ich eigentlich keine Ahnung, aber geht denn nicht eins von den hier:

Delphi-Quellcode:
TJCardlink.JavaClass.isNfcEnabled;
CardLink.isNfcEnabled;
TJCardlink.JavaClass.INSTANCE.isNfcEnabled;

QuickAndDirty 26. Jul 2024 15:44

AW: Android: Klasse aus .jar benutzen
 
Ich weiß keine Lösung, aber das interessiert mich auch.

bcvs 29. Jul 2024 08:23

AW: Android: Klasse aus .jar benutzen
 
Ich kapier das mit den Interfaces nicht.

Versuch1:
Delphi-Quellcode:
var CardLink: TJCardlink;

CardLink:=TJCardlink.JavaClass.INSTANCE; // <-- Inkompatible Typen TJCardlink und JCardlink
CardLink.JavaClass.isNfcEnabled(context);
Versuch2:
Delphi-Quellcode:
var CardLink: TJCardlink;

CardLink:=TJCardlink.Create; // <-- Inkompatible Typen TJCardlink und JCardlink
CardLink.JavaClass.isNfcEnabled(context);
Versuch3:
Delphi-Quellcode:
var CardLink: JCardlink;

CardLink:=TJCardlink.JavaClass.INSTANCE;
CardLink.JavaClass.isNfcEnabled(context); // <-- unbekannter Bezeichner JavaClass
CardLink.isNfcEnabled(context); // <-- unbekannter Bezeichner isNfcEnabled
Ich kann anscheinend nur eine Instanz von JCardlink anlegen. isNfcEnabled steckt aber in JCardlinkClass bzw. TJCardlink.JavaClass. Wie kommt das zusammen?

Olli73 29. Jul 2024 08:29

AW: Android: Klasse aus .jar benutzen
 
Hast du denn meine 3 Optionen probiert?

bcvs 29. Jul 2024 09:52

AW: Android: Klasse aus .jar benutzen
 
Bisher nicht, weil ich der Meinung war, dass ich zuerst wie sonst üblich mit Create o.ä. eine Instanz erzeugen müsste.

Edit: Man sollte immer die Dokumentatinon gründlich lesen. Da steht es ja:
Zitat:

... the Cardlink object. This is a singleton object which always exists. It does not need to be created (instantiated).
Und das hier funktioniert tatsächlich:

Delphi-Quellcode:
if TJCardlink.JavaClass.isNfcEnabled(
      TAndroidHelper.Context
         .getApplicationContext) then
  ShowMessage('NFC enabled')
else
  ShowMessage('NFC disabled');
Danke für den Tipp

Rollo62 2. Aug 2024 16:01

AW: Android: Klasse aus .jar benutzen
 
Alles unter JavaClass ist quasi ähnlich wie eine class method unter Delphi.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:57 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz