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 ответа на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.