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

Delphi在Android下使用Java库的更多相关文章

  1. Android下查看共享库依赖项

    Android下查看共享库依赖项 [时间:2017-02] [状态:Open] [关键词:android,共享库依赖项,so,ndk,objdump,readelf] 起因 近期在处理Android下 ...

  2. 【转】Android下编译jni库的二种方法(含示例)

    原文网址:http://blog.sina.com.cn/s/blog_3e3fcadd01011384.html 总结如下:两种方法是:1)使用Android源码中的Make系统2)使用NDK(从N ...

  3. 【转】Android下编译jni库的二种方法(含示例) -- 不错

    原文网址:http://blog.sina.com.cn/s/blog_3e3fcadd01011384.html 总结如下:两种方法是:1)使用Android源码中的Make系统2)使用NDK(从N ...

  4. [付费视频]Delphi视频Android开发使用静态库(A)和动态库(SO)

    关于本视频:前阵子接到一个委托,解决Delphi开发Android程序中串口通信的问题,厂家那边提供了c文件,需要翻译成delphi可用,翻译倒是比较简单.不过后来翻译读写ic卡单元的时候进行不下去了 ...

  5. Delphi获取Android下GPS的NMEA 0183数据

    下面的程序,可以实现Android下获取GNSS的NMEA0183数据: unit utAndroidNmea; interface uses Androidapi.JNIBridge, Androi ...

  6. Delphi XE10在 Android下调用静态库a文件

    Delphi Seatle can link Delphi project with Static library files(*.a): 1.at Delphi IDE, Add the " ...

  7. Delphi在Android下实现BroadcastReceiver功能(举例在Delphi下获取USB外设拔插消息)

    在Android里,用java通过实现BroadcastReceiver接口,就可以获得Intent消息.可是Delphi程序不能直接实现JBroadcastReceiver,如何能够实现类似Java ...

  8. Delphi在Android下通过WiFI进行调试

    如果我们需要调试USB程序且Android设备只有一个USB口,那么可以通过WiFi来调试程序,这样USB口就可以用了. 大致步骤如下: 1.在有root权限的Android设备里安装“Wifi AD ...

  9. 浅谈Java/Android下的注解

    什么是注解 java.lang.annotation,接口 Annotation,在JDK5.0及以后版本引入. 注解是代码里的特殊标记,这些标记可以在编译.类加载.运行时被读取,并执行相应的处理.通 ...

随机推荐

  1. vue图片上传及java存储图片(亲测可用)

    1.前言 在使用elementui的upload组件时,我一直无法做到上传的图片和其他数据一起提交.单纯的上传文件,java的存储图片的方式也有局限性. 我知道的后端保存图片有两种方式:一种是直接存储 ...

  2. dev gridview指定单元格cell获取坐标

    DevExpress.XtraGrid.Views.Grid.ViewInfo.GridViewInfo Info2 = gvQueryResult.GetViewInfo() as DevExpre ...

  3. 通过ajax记录打印信息

     润乾自带的打印直接可以通过触发js事件来进行调用.onClick="report1_print();return false;" 如果客户需要记录某个用户在某个时间段进行打印 ...

  4. DOMINO的JDBC和ODBC连接方法

     利用ODBC实现Domino和关系数据库的互操作 Lotus Domino是当今办公自动化系统的主流开发平台之一,Domino自带一个非关系型数据库–文档型数据库,而目前大部分企业的信息都储存在 ...

  5. 初次使用git就遭遇不测,提示没有这个服务连接和需要配置git的一个http参数 NO network connection,SSl host could not be verified ...

    第一次使用git 拉取服务上的项目到本地,结果,在拿到访问的url地址后,输入用户名密码,失败了. --eclispe  4.5.3 继承了git客户端插件的版本 ------下一步后,报错 NO n ...

  6. web应用服务端cache策略初探

    一般来说,网站随着访问量以及数据库的增大,访问速度将会越来越慢,如何优化这个响应速度,增大用户支持容量是网站从小到中,到大的必经之路. 你也可能听说过对于大型web站点一般严重依赖于cache来弹性放 ...

  7. 在html的JavaScript部分计算,保留小数点后面的位数

    例: f_pbf = ((f_boday_fat/f_weight)*100).toFixed(1);      注:例子中的.toFixed(1)是所用函数,确保在所得结果中保留小数点后面一位数,若 ...

  8. mysql性能优化-慢查询分析、优化索引和配置 (慢查询日志,explain,profile)

    mysql性能优化-慢查询分析.优化索引和配置 (慢查询日志,explain,profile) 一.优化概述 二.查询与索引优化分析 1性能瓶颈定位 Show命令 慢查询日志 explain分析查询 ...

  9. Linux /dev/null详解

    常用的命令展示 /dev/null 和 /dev/zero的区别        1./dev/null:表示 的是一个黑洞,通常用于丢弃不需要的数据输出, 或者用于输入流的空文件            ...

  10. fiddler post 请求 webapi

    今天小伙伴遇到一个问题,大概就是说用fiddler post 一个参数,但是后台一直无法获取,如下 后来发现请求的条件有问题,而且也很容易忽略,正确如下 content-type的设定为默认值,pos ...