zoukankan      html  css  js  c++  java
  • Delphi在Android下使用Java库

     本文将以Android的USB串口通讯库为例,介绍Delphi如何在Android中使用Java的库。

      USB串口通讯库地址:

      https://github.com/felHR85/UsbSerial

    一、Java库编译

      1.安装Android Studio

      2.在Android Studio中将SDK路径指向Delphi的SDK路径(避免重复安装SDK)

      3.下载UsbSerial,用Android Studio打开,

      3.1Android Studio设置(File->Settings)

      gradle设置

      3.2设置工程属性:

      选择SDK版本:

     

     4.编译UsbSerial(Build-》Make Project)

      编译过程可能需要下载Gradle相关文件。

      编译完成后将生成classes.jar

     5. 生成DEX文件

     5.1生成dex需要用到一个 dx.bat,具体目录是在%Android%uild-tools28.0.3(%Android%为Android SDK目录,28.0.3不特指,每个tools下都有的,%Android%使用的不一定是C:UsersPublicDocumentsEmbarcaderoStudio19.0PlatformSDKsandroid-sdk-windows)

    5.2进入cmd.exe 配置环境变量:路径是dx.bat下的目录

    set ANDROID_HOME=C:UsersPublicDocumentsEmbarcaderoStudio19.0PlatformSDKsandroid-sdk-windows

    set path="C:Program Files (x86)Javajdk1.8.0_144in";%PATH%

    dx --dex --output=C:DelphiCompsUsbSerialinusbserial.dex C:DelphiCompsUsbSerialinclasses.jar

    这样就生成了usbserial.dex

    二、合并dex文件

    生成的dex文件需要与Delphi自带的dex文件进行合并。

    Delphi自带的dex文件分为Debug版本,和Release版本,路径分别在%BDS%libandroidDebug, %BDS%libandroidRelease

    继续在cmd.exe中:

    set BDS=C:Program Files (x86)EmbarcaderoStudio19.0

    set path="C:Program Files (x86)Javajdk1.8.0_144in";%PATH%

    java -cp %DX_LIB%dx.jar com.android.dx.merge.DexMerger debug_classes.dex %BDS%libandroidDebugclasses.dex .usbserial.dex

    java -cp %DX_LIB%dx.jar com.android.dx.merge.DexMerger release_classes.dex %BDS%libandroidReleaseclasses.dex .usbserial.dex

    如果是Debug模式:

    copy debug_classes classes.dex

    如果是Release模式:

    copy Release_classes classes.dex

    三、生成Delphi访问接口

    Delphi 10.1以上自带的Java2OP工具,能够自动生成java类的接口文件。

    在Cmd.exe中

    set BDS=C:Program Files (x86)EmbarcaderoStudio19.0

    set path="C:Program Files (x86)Javajdk1.8.0_144in";%PATH%
    set path=%BDS%inconvertersjava2op";%PATH%
    java2op -jar classes.jar Android.JNI.UsbSerial.pas

    此处的classes.jar即为usbserial编译后的java类库,生成Delphi的接口文件Android.JNI.UsbSerial.pas

    五.使用Java类库

    在Delphi工程中引用Android.JNI.UsbSerial.pas

     获取USB管理服务接口

    function GetUsbManager: JUsbManager;
    var UsbManagerService: JObject;
    begin
      UsbManagerService := SharedActivity.getSystemService(TJContext.JavaClass.USB_SERVICE);
      Result := TJUsbManager.Wrap((UsbManagerService as ILocalObject).GetObjectID);
    end;
    

     获取USB设备列表

    function GetUsbDevices: TArray<JUsbDevice>;
    var
      UsbManager: JUsbManager;
      UsbDeviceList: JHashMap;
      UsbDeviceListIterator: JIterator;
      I: Integer;
    begin
      UsbManager := GetUsbManager;
      if UsbManager <> nil then
      begin
        UsbDeviceList := UsbManager.getDeviceList;
        SetLength(Result, UsbDeviceList.size);
    
        UsbDeviceListIterator := UsbDeviceList.values.iterator;
        for I := 0 to Length(Result) - 1 do
          Result[I] := TJUsbDevice.Wrap((UsbDeviceListIterator.next as ILocalObject).GetObjectID);
      end;
    end;
    

     打开USB设备,返回USB连接接口 

    function GetUsbConnection(Device: JUsbDevice): JUsbDeviceConnection;
    var UsbManager: JUsbManager;
    begin
      UsbManager := GetUsbManager;
      if UsbManager <> nil then
        Result := UsbManager.openDevice(Device);
    end;
    

      

      //创建USB串口
        SerialDevice := TJUsbSerialDevice.JavaClass.createUsbSerialDevice(UsbDevice, UsbConnection);
        if SerialDevice = nil then
        begin
          raise Exceptioin.Create('Cannot create serial device');
          Exit;
        end;
    
      //打开USB串口
        if not SerialDevice.syncOpen then
        begin
          raise Exception.Create('Cannot open serial device');
          SerialDevice := nil;
          UsbConnection.close;
          UsbConnection := nil;
          Exit;
        end;
    

      

        //串口设置
        SerialDevice.setBaudRate(9600);
        SerialDevice.setDataBits(TJUsbSerialInterface_DATA_BITS_8);
        SerialDevice.setStopBits(TJUsbSerialInterface_STOP_BITS_1);
        SerialDevice.setParity(TJUsbSerialInterface_PARITY_NONE);
        SerialDevice.setFlowControl(TJUsbSerialInterface_FLOW_CONTROL_OFF);
    

      

      //读串口:
      if SerialDevice.syncRead(ReadBuffer, 50) >= 1 then
        Data := Data + TEncoding.UTF8.GetString(ToByteArray(ReadBuffer));
    

      

        //写串口
            SerialDevice.syncWrite(WriteBuffer, 1000);
    

      

     

     六、Delphi发布

    1.权限设置,引用的Java类库需要的权限,需要在Delphi工程设置工添加上去。

    2.将新生成的dex文件发布到远程路径classes中,同时java库需要的文件也同时添加

  • 相关阅读:
    Java SE入门(十三)——高级API
    Java SE入门(十二)——修饰符与内部类
    Java SE入门(十一)——接口与多态
    数据结构与算法(一)——绪论
    break与continue的区别以及终止函数的return false
    文字超出隐藏显示省略号及鼠标放上去显示全部文字信息的写法
    组件有新增修改两种状态该怎么使用
    Math常用的属性和方法
    模块化开发及import用法
    element时间日期选择器组件设置默认时间
  • 原文地址:https://www.cnblogs.com/hezihang/p/9957497.html
Copyright © 2011-2022 走看看