本文將以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庫的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VEVB武林網網站的支持!
新聞熱點
疑難解答