void Опубликовано 2 апреля, 2019 Опубликовано 2 апреля, 2019 Добрый день. Собственно вопрос: Как подключить интерфейсы AIDL к Delphi? Есть опыт подключения jar бибилиотек. Тут описано как действовать если есть jar файлы. А если их нет? Есть только AIDL файлы.... Цитата
0 void Опубликовано 3 апреля, 2019 Автор Опубликовано 3 апреля, 2019 (изменено) В delphi есть класс который реализует похожую (с VisualStudio - например) технологию подключения интерфейсов unit Androidapi.JNI.InAppBilling; {*******************************************************} { } { CodeGear Delphi Runtime Library } { Copyright(c) 2013-2018 Embarcadero Technologies, Inc. } { All rights reserved } { } {*******************************************************} unit Androidapi.JNI.InAppBilling; uses Androidapi.JNIBridge, Androidapi.JNI.JavaTypes, Androidapi.JNI.Os; type // ===== Forward declarations ===== JIInAppBillingService = interface;//com.android.vending.billing.IInAppBillingService JIInAppBillingService_Stub = interface;//com.android.vending.billing.IInAppBillingService$Stub // ===== Interface declarations ===== JIInAppBillingServiceClass = interface(JIInterfaceClass) ['{914929AF-917C-4D7E-842C-656701CACCE7}'] end; [JavaSignature('com/android/vending/billing/IInAppBillingService')] JIInAppBillingService = interface(JIInterface) ['{03D4C897-6265-4854-97C6-415F5C846C0E}'] function consumePurchase(apiVersion: Integer; packageName: JString; purchaseToken: JString): Integer; cdecl; function getBuyIntent(apiVersion: Integer; packageName: JString; sku: JString; type_: JString; developerPayload: JString): JBundle; cdecl; function getPurchases(apiVersion: Integer; packageName: JString; type_: JString; continuationToken: JString): JBundle; cdecl; function getSkuDetails(apiVersion: Integer; packageName: JString; type_: JString; skusBundle: JBundle): JBundle; cdecl; function isBillingSupported(apiVersion: Integer; packageName: JString; type_: JString): Integer; cdecl; end; TJIInAppBillingService = class(TJavaGenericImport<JIInAppBillingServiceClass, JIInAppBillingService>) end; JIInAppBillingService_StubClass = interface(JBinderClass) ['{77F4F8A3-E103-4CC1-AB9A-D373F71C6D4C}'] {class} function init: JIInAppBillingService_Stub; cdecl; {class} function asInterface(obj: JIBinder): JIInAppBillingService; cdecl; end; [JavaSignature('com/android/vending/billing/IInAppBillingService$Stub')] JIInAppBillingService_Stub = interface(JBinder) ['{A5D13E53-F09B-4972-A639-BF7D7B81C242}'] function asBinder: JIBinder; cdecl; function onTransact(code: Integer; data: JParcel; reply: JParcel; flags: Integer): Boolean; cdecl; end; TJIInAppBillingService_Stub = class(TJavaGenericImport<JIInAppBillingService_StubClass, JIInAppBillingService_Stub>) end; implementation procedure RegisterTypes; begin TRegTypes.RegisterType('Androidapi.JNI.InAppBilling.JIInAppBillingService', TypeInfo(Androidapi.JNI.InAppBilling.JIInAppBillingService)); TRegTypes.RegisterType('Androidapi.JNI.InAppBilling.JIInAppBillingService_Stub', TypeInfo(Androidapi.JNI.InAppBilling.JIInAppBillingService_Stub)); end; initialization RegisterTypes; end. пробовал подключить подобным образом Обращение (для подключения к интерфейсу): .... FService := TJIInAppBillingService_Stub.JavaClass.asInterface(service); .... Но в моем случае выдает ошибку при таком обрашщении: Java class JIInAppBillingService_Stub could not be found УСЛОВНО (т.е. мой класс а не в примере): Java class MyClass_Stub could not be found JavaSignature - перепроверено названия классов ЧТО НУЖНО для этого обращения еще, кроме выше приведенного класса, чтобы взлетело подобное обращение? Изменено 3 апреля, 2019 пользователем void Цитата
0 void Опубликовано 3 апреля, 2019 Автор Опубликовано 3 апреля, 2019 (изменено) Походу все-таки нужен jar вышеприведенный класс используется в: C:\Program Files (x86)\Embarcadero\Studio\20.0\lib\android\debug\google-play-billing.jar Который в свою очередь подключается в delphi В AndroidStudio сгенерировались Java файлы с интерфейсами в Java Цитата Инструменты Android SDK генерируют интерфейс на языке программирования Java на основе вашего файла .aidl . Этот интерфейс имеет внутренний абстрактный класс с именем Stub который расширяет Binder и реализует методы из вашего интерфейса AIDL. Вы должны расширить класс Stub и реализовать методы. Теперь вопрос: Как из этих файлов сделать jar библиотеку? используя все зависимости от андроида Изменено 3 апреля, 2019 пользователем void Цитата
0 denfm Опубликовано 28 мая, 2019 Опубликовано 28 мая, 2019 (изменено) В 02.04.2019 в 12:08, void сказал: Как подключить интерфейсы AIDL к Delphi? Относительно не сложно 1) сперва нужно сгенерировать java файлы на базе aidl интерфейсов Это можно сделать автоматически в Android Studio на пустом проекте(там aidl интерфейсы генерируются в java автоматом при сборке проекта ) или использовать aidl.exe, как-то так: set ANDROID_SDK="C:\Users\Public\Documents\Embarcadero\Studio\19.0\PlatformSDKs\android-sdk-windows" set ANDROID_PLATFORM=%ANDROID_SDK%\platforms\android-19 set ANDROID_BUILD_TOOLS=%ANDROID_SDK%\build-tools\28.0.3 set ANDROID_AIDL=%ANDROID_BUILD_TOOLS%\aidl.exe set AIDL_DIR=src_aidl set OUTPUT_DIR=src_java rmdir %OUTPUT_DIR% /s /q mkdir %OUTPUT_DIR% 2> nul %ANDROID_AIDL% -p%ANDROID_PLATFORM%\framework.aidl -o%OUTPUT_DIR% -d%OUTPUT_DIR%\f.d -I%AIDL_DIR% %путь к файлу%\file.aidl 2) далее, на базе статей delphifmandroid.blogspot.com, собрать jar библиотеку и pas-интерфейсы к ней @echo off setlocal rem Add to system path JAVA_BIN set JAVA_BIN= set ANDROID_SDK="C:\Users\Public\Documents\Embarcadero\Studio\19.0\PlatformSDKs\android-sdk-windows" set ANDROID_PLATFORM=%ANDROID_SDK%\platforms\android-19 set ANDROID_BUILD_TOOLS=%ANDROID_SDK%\build-tools\28.0.3 set JAVA2OP="C:\Program Files (x86)\Embarcadero\Studio\19.0\bin\converters\java2op\Java2OP.exe" set JAR_FILE_NAME=testFile set filtr_package=base_package_name set JAVA2OP_PARAMS=-classes %filtr_package%.* -unit Android.JNI.%JAR_FILE_NAME% set PACKAGE_MAIN=. set VERBOSE=0 set OUTPUT_DIR=build set SRC_DIR=src_java rmdir %OUTPUT_DIR% /s /q mkdir %OUTPUT_DIR% 2> nul echo === Fill list Java files === cd %SRC_DIR% dir /s /B *.java > ..\%OUTPUT_DIR%\src_list.txt cd.. set JAVA_FILES="@%OUTPUT_DIR%\src_list.txt" echo. echo === Compiling the Java source files === echo. mkdir %OUTPUT_DIR%\classes 2> nul if x%VERBOSE% == x1 SET VERBOSE_FLAG=-verbose %JAVA_BIN%javac %VERBOSE_FLAG% -cp %ANDROID_PLATFORM%\android.jar -d %OUTPUT_DIR%\classes %JAVA_FILES% echo. echo === Creating jar === echo. if x%VERBOSE% == x1 SET VERBOSE_FLAG=v %JAVA_BIN%jar c%VERBOSE_FLAG%f %OUTPUT_DIR%\%JAR_FILE_NAME%.jar -C %OUTPUT_DIR%\classes %PACKAGE_MAIN% echo. echo === Creating Interfaces === echo. cd %OUTPUT_DIR% %JAVA2OP% -jar %JAR_FILE_NAME%.jar %JAVA2OP_PARAMS% cd .. echo. echo === END === endlocal далее jar файл подключить к библиотекам Android(через IDE), а интерфейсы как модуль pas файл рекомендую почистить от лишних интерфейсов типа StringBuilder и пр. 3) На базе JServiceConnection реализовать подключение к вашему приложению готовое решение можно позаимствовать от сюда: Embarcadero\Studio\19.0\source\fmx\FMX.InAppPurchase.Android.pas, где само подключение к интерфейсу выглядит так: FService := TJIInAppBillingService_Stub.JavaClass.asInterface(service); также рекомендую обратить внимание на TRemoteServiceConnection класс, на основе реализаций которого можно набросать свой сервис Изменено 28 мая, 2019 пользователем denfm Цитата
Вопрос
void
Добрый день.
Собственно вопрос:
Как подключить интерфейсы AIDL к Delphi?
Есть опыт подключения jar бибилиотек.
Тут описано как действовать если есть jar файлы.
А если их нет?
Есть только AIDL файлы....
3 ответа на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.