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.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%
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库需要的文件也同时添加
上一篇: 【pytorch】【解决】RuntimeError: Integer division of tensors using div or / is no longer supported
下一篇: delphi黑色背景模式
推荐阅读
-
java在linux系统下开机启动无法使用sudo命令的原因及解决办法
-
java在linux系统下开机启动无法使用sudo命令的原因及解决办法
-
java连接redis是数据库(redis在java项目中的使用)
-
在Tomcat服务器下使用连接池连接Oracle数据库
-
java连接redis是数据库(redis在java项目中的使用)
-
使用Java代码在Android中实现图片裁剪功能
-
Delphi在Android下使用Java库的方法
-
第三方库LibUSB在Android系统上的简单使用
-
在Tomcat服务器下使用连接池连接Oracle数据库
-
google gflags库在Windows+Visual Studio2017环境下的安装与使用