Einzelnen Beitrag anzeigen

Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#1

Androidapi.JNI Interface und function : TJavaArray<>; cdecl;

  Alt 18. Jun 2014, 12:02
Ich versuche hier gerade ein USB Schnittstelle anzusprechen, in JAVA funktioniert es, unter Delphi irgendwie nicht.
Die Übergabe von einem TJavaArray funktioniert irgendwie nicht.

In JAVA funktioniert folgender Quelltext:

Code:
import android.hardware.usb.UsbAccessory;
import android.hardware.usb.UsbManager;

    public void onClick(View v) {

        UsbManager USBManager = null;
        UsbAccessory[] AccessoryList = null;
        UsbAccessory Accessory = null;      
       

        USBManager = (UsbManager) this.getSystemService(this.USB_SERVICE);      
        AccessoryList = USBManager.getAccessoryList();
        Accessory = AccessoryList[0];

        if (Accessory != null) {         
            SendDebug("Accessory Descriptions: " + Accessory.getDescription());
        } else {         
            SendDebug("Accessory null");
        }
    }
In Delphi hab ich mir jetzt mit Hilfe von diesem Beispiel

http://www.bverhue.nl/g2dev/?p=65
und diesem Importiertem Interface:

https://github.com/FMXExpress/androi...UsbManager.pas


Delphi-Quellcode:
  [JavaSignature('android/hardware/usb/UsbManager')]
  JUsbManager = interface(JObject)
    ['{4103C58D-D2FF-4010-B24E-0B970AB95F30}']
    function getAccessoryList : TJavaArray<JUsbAccessory>; cdecl; // ()[Landroid/hardware/usb/UsbAccessory; A: $1
    function getDeviceList : JHashMap; cdecl; // ()Ljava/util/HashMap; A: $1
    function hasPermission(accessory : JUsbAccessory) : boolean; cdecl; overload;// (Landroid/hardware/usb/UsbAccessory;)Z A: $1
    function hasPermission(device : JUsbDevice) : boolean; cdecl; overload; // (Landroid/hardware/usb/UsbDevice;)Z A: $1
    function openAccessory(accessory : JUsbAccessory) : JParcelFileDescriptor; cdecl;// (Landroid/hardware/usb/UsbAccessory;)Landroid/os/ParcelFileDescriptor; A: $1
    function openDevice(device : JUsbDevice) : JUsbDeviceConnection; cdecl; // (Landroid/hardware/usb/UsbDevice;)Landroid/hardware/usb/UsbDeviceConnection; A: $1
    procedure requestPermission(accessory : JUsbAccessory; pi : JPendingIntent) ; cdecl; overload;// (Landroid/hardware/usb/UsbAccessory;Landroid/app/PendingIntent;)V A: $1
    procedure requestPermission(device : JUsbDevice; pi : JPendingIntent) ; cdecl; overload;// (Landroid/hardware/usb/UsbDevice;Landroid/app/PendingIntent;)V A: $1
  end;

  TJUsbManager = class(TJavaGenericImport<JUsbManagerClass, JUsbManager>)
  end;

auf den USB Manager komme ich noch, und USBManager.ToString gibt mir auch noch "android.hardware.usb.UsbManager@413c1250" aus
Auch die Accessorylist kann ich noch zuweisen, und diese gibt mir die richtige Länge von 1 (wenn ein Gerät angeschlossen ist, ansonsten ist sie nil)
Nur wenn ich auf item[0] zugreifen will, geht das nicht.


Delphi-Quellcode:
var JavaObject : JObject;
    UsbManager : JUSBManager;
    AccessoryList : TJavaArray<JUsbAccessory>;
    Accessory : JUsbAccessory;

begin

 try

  // Get pointer to UsbManager
  JavaObject := SharedActivityContext.getSystemService(TJContext.JavaClass.USB_SERVICE);
  UsbManager := TJUSBManager.Wrap((JavaObject as ILocalObject).GetObjectID);
  AccessoryList := UsbManager.getAccessoryList;

  // das geht noch
  mmlog.Lines.Add('Lenght: ' + inttostr( AccessoryList.Length));
  
  // das geht schief mit:
  // Zugriffsverletzung bei Adresse 5574A848 beim Zugriff auf Adresse 00000000
  Accessory := AccessoryList.Items[0];
was mach ich jetzt noch falsch?
Vielen Dank!
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat