本文将以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-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_144bin”;%PATH%
dx –dex –output=C:DelphiCompsUsbSerialbinusbserial.dexC:DelphiCompsUsbSerialbinclasses.jar
这样就生成了usbserial.dex
二、合并dex文件
生成的dex文件需要与Delphi自带的dex文件进行合并。
Delphi自带的dex文件分为Debug版本,和Release版本,路径分别在�S%libandroidDebug,�S%libandroidRelease
继续在cmd.exe中:
set BDS=C:Program Files (x86)EmbarcaderoStudio19.0
set path=”C:Program Files (x86)Javajdk1.8.0_144bin”;%PATH%
java -cp %DX_LIB%dx.jar com.android.dx.merge.DexMerger debug_classes.dex �S%libandroidDebugclasses.dex .usbserial.dex
java -cp %DX_LIB%dx.jar com.android.dx.merge.DexMerger release_classes.dex �S%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
代码语言:javascript复制set path="C:Program Files (x86)Javajdk1.8.0_144bin";%PATH%
set path=�S%binconvertersjava2op";%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管理服务接口
代码语言:javascript复制function GetUsbManager: JUsbManager;
var UsbManagerService: JObject;
begin
UsbManagerService := SharedActivity.getSystemService(TJContext.JavaClass.USB_SERVICE);
Result := TJUsbManager.Wrap((UsbManagerService as ILocalObject).GetObjectID);
end;
获取USB设备列表
代码语言:javascript复制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连接接口
代码语言:javascript复制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库需要的文件也同时添加
总结
以上所述是小编给大家介绍的Delphi在Android下使用Java库的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对ZaLou.Cn网站的支持!