Перейти к содержанию
Fire Monkey от А до Я
  • 0

Подключение интерфейсов AIDL


void

Вопрос

Добрый день.

Собственно вопрос:

Как подключить интерфейсы AIDL к Delphi?

Есть опыт подключения jar бибилиотек.

Тут описано как действовать если есть jar файлы.
А если их нет?
Есть только AIDL файлы....

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

В 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 - перепроверено названия классов

ЧТО НУЖНО для этого обращения еще, кроме выше приведенного класса, чтобы взлетело подобное обращение?

Изменено пользователем void
Ссылка на комментарий
  • 0

Походу все-таки нужен 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 библиотеку?
используя все зависимости от андроида
 

Изменено пользователем void
Ссылка на комментарий
  • 0
В 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 класс, на основе реализаций которого можно набросать свой сервис

Изменено пользователем denfm
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...