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库需要的文件也同时添加

  • 相关阅读:
    HDU4628+状态压缩DP
    Javascript 去掉字符串前后空格的五种方法
    Javascript 数组之判断取值和数组取值
    ASP.NET MVC 出现错误 “The view 'XXX' or its master was not found or no view engine support”
    ASP.NET MVC 页面调整并传递参数
    ASP.NET MV3 部署网站 报"Could not load file or assembly ' System.Web.Helpers “ 错的解决方法
    ASP.NET MVC 控制器向View传值的三种方法
    CSharp 如何通过拼接XML调用存储过程来查询数据
    SQLServer : EXEC和sp_executesql的区别
    关于SQLServer2005的学习笔记—异常捕获及处理
  • 原文地址:https://www.cnblogs.com/hezihang/p/9957497.html
Copyright © 2011-2022 走看看