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

Delphi在Android下使用Java库的更多相关文章
- Android下查看共享库依赖项
Android下查看共享库依赖项 [时间:2017-02] [状态:Open] [关键词:android,共享库依赖项,so,ndk,objdump,readelf] 起因 近期在处理Android下 ...
- 【转】Android下编译jni库的二种方法(含示例)
原文网址:http://blog.sina.com.cn/s/blog_3e3fcadd01011384.html 总结如下:两种方法是:1)使用Android源码中的Make系统2)使用NDK(从N ...
- 【转】Android下编译jni库的二种方法(含示例) -- 不错
原文网址:http://blog.sina.com.cn/s/blog_3e3fcadd01011384.html 总结如下:两种方法是:1)使用Android源码中的Make系统2)使用NDK(从N ...
- [付费视频]Delphi视频Android开发使用静态库(A)和动态库(SO)
关于本视频:前阵子接到一个委托,解决Delphi开发Android程序中串口通信的问题,厂家那边提供了c文件,需要翻译成delphi可用,翻译倒是比较简单.不过后来翻译读写ic卡单元的时候进行不下去了 ...
- Delphi获取Android下GPS的NMEA 0183数据
下面的程序,可以实现Android下获取GNSS的NMEA0183数据: unit utAndroidNmea; interface uses Androidapi.JNIBridge, Androi ...
- Delphi XE10在 Android下调用静态库a文件
Delphi Seatle can link Delphi project with Static library files(*.a): 1.at Delphi IDE, Add the " ...
- Delphi在Android下实现BroadcastReceiver功能(举例在Delphi下获取USB外设拔插消息)
在Android里,用java通过实现BroadcastReceiver接口,就可以获得Intent消息.可是Delphi程序不能直接实现JBroadcastReceiver,如何能够实现类似Java ...
- Delphi在Android下通过WiFI进行调试
如果我们需要调试USB程序且Android设备只有一个USB口,那么可以通过WiFi来调试程序,这样USB口就可以用了. 大致步骤如下: 1.在有root权限的Android设备里安装“Wifi AD ...
- 浅谈Java/Android下的注解
什么是注解 java.lang.annotation,接口 Annotation,在JDK5.0及以后版本引入. 注解是代码里的特殊标记,这些标记可以在编译.类加载.运行时被读取,并执行相应的处理.通 ...
随机推荐
- Android中的color使用
1.系统颜色 android内置的颜色,比如系统资源中定义的颜色,有以下几个:BLACK(黑色),BLUE(蓝色),CYAN(青色),GRAY(灰色),GREEN(绿色),RED(红色),WRITE( ...
- Centos 使用C++11 编译
今天编译代码,发现使用auto后无法编译,我的当前linux内核版本:(4.7之后即可支持C++11) 这时,在编译末尾加入 -std=c++11 就可以正常编译了.如:
- 记录一次测试环境遇到的push消息记录
测试环境测试push消息,调用消息中心同事的api接口,感觉怎么都调用不通.纠结了一天,最终发现原因:一是版本的问题,不同的测试包有不同的版本,不同的版本 可能push的消息不同.二是 用户有没有 开 ...
- JVM知识(三):内存模型和可见性
这篇文章我们将根据JVM的内存模型探索java当中变量的可见性以及不同的java指令在并发时可能发生的指令重排序的情况.来聊聊java线程对一个变量的更新怎么通知另一个线程,及volatile的作用和 ...
- [域|Domain] The trust relationship between this workstation and the primary domain failed 此工作站和主域间的信任关系失败
PS> $cred = Get-Credential domain.sample.com;Reset-ComputerMachinePassword -Credential $cred -Ser ...
- 远程监视jboss应用java内存的配置
前言 因为最近一个项目部署在客户那边运行一个月左右就会出现java内存溢出的问题,为了时时监控java内存的情况需要,需要远程查看服务器上java内存的一些情况.在公司模拟部署了远程监视linux下项 ...
- 几个很好用SQL语法(SqlServer)
1,MERGE INTO 语句: 这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE,作用还是很强大的(简单的说就是它可以批量更新和插入处理一个数据集,如果存在就更新 ...
- 12.2Data Guard新特性--使用DBMS_DBCOMP.DBCOMP数据比较
Oracle Data Guard会主动对Hot数据(数据正被读取或修改)执行验证, 无论是primary还是standby,但对于那些Cold数据不会做任何检查和校验.所以在12.2版本 ...
- GBK与UTF-8编码错误转换后,无法再正确恢复
字符集错误转换导致的问题 UTF-8格式编码的字节流,按GBK字符集转换为字符串,会出现乱码,这很正常.但将其重新转为字节流,再用UTF-8字符集转为字符串,还是乱码.这就让我产生了疑惑,虽然使用错误 ...
- 水晶报表自定义纸张大小打印 (Crystal Report Print with custom paper size)
System.Drawing.Printing.PrintDocument doc = new PrintDocument(); doc.PrinterSettings.PrinterName = & ...