欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Delphi在Android下使用Java库

程序员文章站 2022-06-15 14:54:24
本文将以Android的USB串口通讯库为例,介绍Delphi如何在Android中使用Java的库。 USB串口通讯库地址: https://github.com/felHR85/UsbSerial 一、Java库编译 1.安装Android Studio 2.在Android Studio中将S ......

 本文将以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设置

Delphi在Android下使用Java库

Delphi在Android下使用Java库

 

  3.2设置工程属性:

  选择sdk版本:

Delphi在Android下使用Java库

 Delphi在Android下使用Java库

 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)

Delphi在Android下使用Java库

 

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

Delphi在Android下使用Java库