在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
本文将以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%\build-tools\28.0.3(%Android%为Android SDK目录,28.0.3不特指,每个tools下都有的,%Android%使用的不一定是C:\Users\Public\Documents\Embarcadero\Studio\19.0\PlatformSDKs\android-sdk-windows)
5.2进入cmd.exe 配置环境变量:路径是dx.bat下的目录 set ANDROID_HOME=\C:\Users\Public\Documents\Embarcadero\Studio\19.0\PlatformSDKs\android-sdk-windows set path="C:\Program Files (x86)\Java\jdk1.8.0_144\bin";%PATH% dx --dex --output=C:\DelphiComps\UsbSerial\bin\usbserial.dex C:\DelphiComps\UsbSerial\bin\classes.jar 这样就生成了usbserial.dex 二、合并dex文件 生成的dex文件需要与Delphi自带的dex文件进行合并。 Delphi自带的dex文件分为Debug版本,和Release版本,路径分别在%BDS%\lib\android\Debug, %BDS%\lib\android\Release 继续在cmd.exe中: set BDS=C:\Program Files (x86)\Embarcadero\Studio\19.0 set path="C:\Program Files (x86)\Java\jdk1.8.0_144\bin";%PATH% java -cp %DX_LIB%\dx.jar com.android.dx.merge.DexMerger debug_classes.dex %BDS%\lib\android\Debug\classes.dex .\usbserial.dex java -cp %DX_LIB%\dx.jar com.android.dx.merge.DexMerger release_classes.dex %BDS%\lib\android\Release\classes.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)\Embarcadero\Studio\19.0 set path="C:\Program Files (x86)\Java\jdk1.8.0_144\bin";%PATH% 此处的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库需要的文件也同时添加
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论