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%\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.dexc:\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% set path=%bds%\bin\converters\java2op";%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库需要的文件也同时添加
总结
以上所述是小编给大家介绍的delphi在android下使用java库的方法,希望对大家有所帮助