블루투스 바코드 스캐너(BI-07) 안드로이드 라이브러리를 델파이에서 연동하는 방법

2017.03.20 17:03

S모전자에서 의뢰한 휴대용 바코드 스캐너와 연동한 내용 공유합니다.

휴대용 바코드 스캐너는 JAR 형태의 안드로이드 라이브러리를 제공합니다.

이 과정을 통해 델파이와 안드로이드 라이브러리 연동하는 내용을 소개합니다.


휴대용 바코드 스캐너 연동



위 영상의 휴대용 바코더 스캐너는 클래식 블루투스 기반으로 연결을 제공합니다.

해당 안드로이드 앱은 델파이로 제작했으며, JAR 파일을 이용해 스캐너와 연동합니다.


JAR 파일 연동과정은 아래와 같습니다.

1, 준비(라이브러리 준비 및 분석)

2, 델파이용 안드로이드 라이브러리 브릿지 파일 생성

3, 델파이 프로젝트에 안드로이드 라이브러리 추가

4, 브릿지 파일을 이용해 안드로이드 라이브러리 연동


기타 안드로이드 라이브러리 연동 시 참고사항

델파이 샘플 프로젝트


준비(라이브러리 준비 및 분석)

대상 장비(Point Mobile BI-07)

Point Mobile: BI-07

링크: http://www.pointmobile.co.kr/item.php?it_id=1381210470&ca_id=401010


라이브러리 준비 및 분석

안드로이드와 iOS 라이브러리를 제공합니다.

안드로이드 라이브러리(jar) :  PM3SDK_connectByAddress.jar

라이브러리 관련 문서 및 샘플 :  BI07PM3SDK_Document.chm

대부분의 라이브러리 제공 시 연동 문서와 샘플코드를 제공합니다.

문서를 잘 숙지하고, 샘플코드를 분석합니다. 대략적으로 소스코드를 파악하되 해당 라이브러리 호출하는 부분은 정확히 숙지해야 합니다.

델파이용 안드로이드 라이브러리 브릿지 파일 생성

델파이에서 안드로이드 라이브러리를 사용하기위해 브릿지 파일을 생성해야 합니다.

브릿지 파일 생성

Java2OP.exe를 이용 델파이 브릿지 파일을 생성합니다. Java2OP는 JAR 파일(*.jar) 또는 Java 소스파일을 호출할 수 있는 델파이 코드를 생성합니다.(참고: 파이어모키에서 외부 라이브러리 연동하기(jar, so, a))

아래 커맨드를 이용해 브릿지 파일(Androidapi.JNI.PM3SDK_BI07.pas)을 생성합니다.
D:\ProjectExt\SamsungElectronics>set path=%PATH%;"c:\Program Files (x86)\Embarcadero\Studio\18.0\bin\converters\java2op"

D:\ProjectExt\SamsungElectronics>java2op -jar .\SDK\PM3SDK_connectByAddress.jar -unit AndroidapiJNI.PM3SDK_BI07
Warning: error opening ReservedWordsOP.txt
Warning: error opening ReservedWordsC.txt
Parsing xml: c:\Program Files (x86)\Embarcadero\Studio\18.0\bin\converters\java2op\bootclasses.xml
Parsing jar: D:\ProjectExt\SamsungElectronics\SDK\PM3SDK_connectByAddress.jar

D:\ProjectExt\SamsungElectronics>

생성된 결과


델파이 프로젝트에 안드로이드 라이브러리 추가

라이브러리 추가

멀티-디바이스 폼 애플리케이션(파이어몽키) 프로젝트에서 대상 플랫폼(Target Platform)을 안드로이드로 설정 후 Libraries 항목에 JAR 파일(안드로이드 라이브러리)을 추가합니다.


델파이 브릿지 파일 추가

해당 라이브러리를 사용하기 위해 델파이 브릿지 파일(Androidapi.JNI.PM3SDK_BI07.pas)을 프로젝트에 추가합니다.

브릿지 파일 확인을 위해 컴파일 합니다.

만약, 컴파일 시 E2029 오류 발생 시 다음을 참고해 조치합니다.

E2029 오류 조치방법

E2029 오류는 예약어를 용도와 다른 곳에서 사용할 경우 발생합니다.

오류가 발생하는 예약어 키워드 앞에 "&"을 추가해 해결합니다.

(예> type -> &type, in -> &in)

(참고: http://tech.devgear.co.kr/delphi_qna/420082)

브릿지 파일을 이용해 안드로이드 라이브러리 연동

라이브러리 연동 문서와 샘플코드를 참고해 기능을 구현했습니다.

그 중 가장 빈번히 사용되는 자바 객체 생성과 처음 구현해본 자바 핸들러 콜백함수 구현, 가장 어렵게 변환했던 자바 오브젝트로 캐스팅된 바이트 배열에서 데이터 가져오기 3가지 내용 소개합니다.

자바 객체 생성

브릿지 파일은 라이브러리에 구현된 클래스 인터페이스가 다음과 같이 구현되어 있습니다.

(BluetoothChatService 클래스)

위와 같이 자바 클래스는 2개의 인터페이스와 1개의 클래스로 정의됩니다.


JBluetoothChatServiceClass 인터페이스는 클래스 함수와 속성, 상수를 제공합니다.(생성하기 전 사용)

JBluetoothChatService 인터페이스는 인스턴스 함수와 속성, 상수를 제공합니다.(생성해서 사용)


델파이에서 자바 객체 생성은 아래와 같이 클래스.JavaClass.Init(파라메터) 형식으로 구현합니다.

var
  FChatService: JBluetoothChatService;
...
  FChatService := TJBluetoothChatService.JavaClass.init(Context, FHandler);

자바 핸들러 콜백함수 구현

바코드 스캐너에서 바코드 데이터 수신은 핸들러의 콜백함수를 통해 받습니다.

그 자바코드는 아래와 같습니다.
private final Handler mHandler = new Handler() {
}

mChatService = new BluetoothChatService(mContext, mHandler);
SendCommand.SendCommandInit(mChatService, mHandler);

델파이에서는 다음과 같이 구현했습니다.

1) 핸들러 콜백함수 정의

type
  THandleMessageEvent = procedure(msg: JMessage) of object;
  TCharServiceHandlerCallback = class(TJavaLocal, JHandler_Callback)
  private
    FOnHandleMessage: THandleMessageEvent;
  public
    function handleMessage(msg: JMessage): Boolean; cdecl;

    property OnHandleMessage: THandleMessageEvent read FOnHandleMessage write FOnHandleMessage;
  end;

주의할 점은, 인터페이스(JHandler_Callback)를 상속받은 메소드(handleMessage)는 public 영역에 구현해야 합니다.

습관적으로 델파이와 같이 private 영역에 선언 시 "Segmentation fault (11)" 오류(잘못된 메모리 영역 참조)로 상당히 고생했습니다.


2) 핸들러, 콜백 객체 생성, 이벤트 연결(OnHandleMessage)

  private
    FHandler: JHandler;
    FCallback: TCharServiceHandler;

  FCallback := TCharServiceHandlerCallback.Create;
  FCallback.OnHandleMessage := ChatServiceHandleMessage;

  Context := TAndroidHelper.Context;
  Looper := TJLooper.JavaClass.getMainLooper;
  FHandler := TJHandler.JavaClass.init(Looper, FCallback);

  FChatService := TJBluetoothChatService.JavaClass.init(Context, FHandler);
  TJSendCommand.JavaClass.SendCommandInit(FChatService, FHandler);

콜백 객체 생성 후 OnHandleMessage 이벤트를 연결해 데이터를 수신합니다.

핸들러 생성 시 콜백 객체를 파라메터로 전달합니다.

핸들러 객체는 BluetoothChatService와 SendCommand 객체 생성 시 파라메터로 전달합니다.


3) 핸들러 콜백과 연결된 이벤트 발생

procedure TPointMobileBluetoothChatService.ChatServiceHandleMessage(
  msg: JMessage);
var
  DeviceName, JData: JString;
begin
  Log.d(msg.what.ToString);
  case msg.what of
  MESSAGE_STATE_CHANGE:
    ProcessHandlerStateChage;
  MESSAGE_BARCODE:
    ProcessHandlerBarcord(msg.obj, msg.arg1);
  MESSAGE_DEVICE_NAME:
    begin
      DeviceName := msg.getData.getString(StringToJString('device_name'));
      Log.d('Device name: ' + JStringToString(DeviceName));
    end;

  // 필요한 이벤트 추가 할 것
  end;
end;

스캐너 라이브러리는 바코드 정보 수신 시 핸들러 콜백과 연결된 이벤트로 데이터를 제공합니다.(이벤트가 발생합니다.)

자바 오브젝트로 캐스팅된 바이트 배열(byte[]) 데이터 가져오기

어디에서도 참고할 내용이 없어 가장 고생했던 내용입니다. 델파이 내부 구조를 분석하고 예측해서 구현했습니다.


자바에서 다음과 같이 오브젝트를 바이트 배열로 치환(캐스팅)하는 코드입니다.

byte[] BarcodeBuff = (byte[]) msg.obj;


델파이에서는 다음과 같이 구현했습니다.

function JObjectToStr(const AJObject: JObject): string;
var
  LObj: ILocalObject;
  ObjID: Pointer;
  JBytes: TJavaArray;
  JData: JString;
begin
  Result := '';

  if JStringToString(AJObject.getClass.getCanonicalName) <> 'byte[]' then
    Exit;

  if AJObject.QueryInterface(ILocalObject, LObj) = 0  then
    ObjID := LObj.GetObjectID
  else
    Exit;

  JBytes := TJavaArray(WrapJNIArray(ObjID, TypeInfo(TJavaArray)));
  JData := TJString.JavaClass.init(JBytes, 0, JBytes.Length);
  Result := JStringToString(JData);
end;

var
  Data: string;
begin
  Data := JObjectToStr(msg.obj);
end;


안드로이드 라이브러리 연동 참고사항

가장 좋은 참고자료는 파이어몽키 소스코드였습니다.


델파이 설치 경로 하위 source 디렉토리에는 파이어몽키 라이브러리 소스코드들이 포함되어 있습니다.(정식 제품의 경우에 한함)


그중 아래 경로의 소스코드들을 참고하시기 바랍니다.(Delphi 10.1 베를린 버전 기준)


안드로이드 SDK 브릿지 파일들

안드로이드 SDK 델파이 브릿지 파일이 포함되어 있습니다. 자바 소스코드의 객체이름을 다음 경로의 소스코드들에서 찾아 필요한 경우 uses 절에 추가 후 사용합니다.

C:\Program Files (x86)\Embarcadero\Studio\18.0\source\rtl\android

파이어몽키 라이브러리

다음 경로 중 FMX.AddressBook.Android.pas과 같이 Android가 포함된 파일들을 참고하기 바랍니다.

위 안드로이드 SDK 브릿지 파일들을 이용한 코드들로 구현되어 있습니다.

C:\Program Files (x86)\Embarcadero\Studio\18.0\source\fmx



델파이 샘플 프로젝트


기타 궁금한 내용은 댓글 또는 http://blog.hjf.pe.kr/452의 댓글을 참고하거나 등록해주세요.

저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

험프리.김현수 험프리.김현수 파이어몽키 FMX, JNI, PointMobile, 바코드스캐너, 안드로이드

  1. Blog Icon
    silkroad99

    안녕하세요
    많은 도움을 받고 있습니다.
    혹 PM3SDK_connectByAddress.jar 파일은 어디서 다운받는건가요

  2. 이런, 제가 링크를 안걸었네요^^
    다운로드 링크 추가했습니다.

  3. Blog Icon
    barcoder

    위에 소스를 다운받아 컴파일시에 오류가 발생합니다..
    시애틀 사용자구요..
    메시지는 아래와 같습니다..

    Checking project dependencies...
    Compiling PointMobileBI07.dproj (Debug, Android)
    dccaarm command line for "PointMobileBI07.dpr"
    f:\program files (x86)\embarcadero\studio\17.0\bin\dccaarm.exe -$O- --no-config -M -Q -TX.so -AGenerics.Collections=System.Generics.Collections;
    Generics.Defaults=System.Generics.Defaults;WinTypes=Winapi.Windows;WinProcs=Winapi.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE -DDEBUG
    -E.\Android\Debug -I"f:\program files (x86)\embarcadero\studio\17.0\lib\Android\debug";"f:\program files
    (x86)\embarcadero\studio\17.0\lib\Android\Release" -LEC:\Users\Public\Documents\Embarcadero\Studio\17.0\Bpl\Android
    -LNC:\Users\Public\Documents\Embarcadero\Studio\17.0\Dcp\Android -NU.\Android\Debug -NSSystem;Xml;Data;Datasnap;Web;Soap; -O"f:\program files
    (x86)\embarcadero\studio\17.0\lib\Android\Release" -R"f:\program files (x86)\embarcadero\studio\17.0\lib\Android\Release" -U"f:\program files
    (x86)\embarcadero\studio\17.0\lib\Android\debug";"f:\program files (x86)\embarcadero\studio\17.0\lib\Android\Release" --libpath:"F:\Program Files
    (x86)\Embarcadero\Studio\15.0\PlatformSDKs\android-ndk-r9c\platforms\android-14\arch-arm\usr\lib";"F:\Program Files
    (x86)\Embarcadero\Studio\15.0\PlatformSDKs\android-ndk-r9c\sources\cxx-stl\gnu-libstdc++\4.8\libs\armeabi-v7a" --linker:"F:\Program Files
    (x86)\Embarcadero\Studio\15.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe" -V
    -VN -NO.\Android\Debug PointMobileBI07.dpr
    [DCC Error] PointMobileBluetoothChatService.pas(147): E2035 Not enough actual parameters
    [DCC Warning] PointMobileBluetoothChatService.pas(158): W1000 Symbol 'SharedActivityContext' is deprecated: 'Use TAndroidHelper.Context'
    [DCC Error] PointMobileBluetoothChatService.pas(160): E2250 There is no overloaded version of 'CallInUIThread' that can be called with these arguments
    [DCC Error] PointMobileBluetoothChatService.pas(308): E2250 There is no overloaded version of 'Queue' that can be called with these arguments
    [DCC Fatal Error] MainForm.pas(18): F2063 Could not compile used unit 'PointMobileBluetoothChatService.pas'
    Failed
    Elapsed time: 00:00:02.9
    [Warning] W1000 Symbol 'SharedActivityContext' is deprecated: 'Use TAndroidHelper.Context'
    [Warning] W1000 Symbol 'SharedActivityContext' is deprecated: 'Use TAndroidHelper.Context'

  4. 해당 프로젝트는 10.1 베를린에서 작성되었습니다.
    버전별로 함수의 파라메터가 다를 수 있으니, 시애틀로 컴파일 시 오류를 확인해 조치하시기 바랍니다.

  5. Blog Icon
    silkroad99

    안녕하세요
    샘플 프로젝트를 베를린에서 테스트 해보고 있습니다.
    프로젝트 소스에서 압축을 풀면

    begin
    Application.Initialize;
    AApplication.CreateForm(TForm1, Form1);
    pplication.Run;
    end.

    상단에서 압축문제인지 잘 못된것을 수정하고나서
    컴파일하고 실행하면 바코드 스캐너가 스캔을 못합니다.

    메모장에 커서를 놓으면 바코드 리딩이 되는데
    스캔 버튼 클릭하면 작동이 안됩니다.

    메모장이나 에디트박스에서 커서 위치시키고
    스캔해야만 됩니다.
    제가 뭐를 잘못하고 있는건가요

  6. 위 영상을 보시면 아시겠지만, 저는 메모나 에디터에 커서를 놓지 않아도 스캔이 잘 동작합니다.

    자세한 내용은 github 소스코드와 설치한 소스코드를 비교해보시거나, 디버깅(F9 버튼으로 실행)해보시며 찾아보시기 바랍니다.

    질문만 보고는 제가 조언드릴 부분이 없네요.

  7. Blog Icon
    silkroad99

    빠른 답변에 감사드립니다.

    여기에는 파일 업로드를 할수없어
    부득이하게 데브기어 개발자QnA에
    프로젝트를 업로드했습니다.

    가능하시다면 어디가 오류인지 부탁드립니다.

    감사합니다.

  8. http://tech.devgear.co.kr/delphi_qna/432793
    위 글에 답변 달았습니다.

  9. Blog Icon
    silkroad99

    감사합니다.

안드로이드 API를 파이어몽키에서 사용하기(Toast 메시지 구현)

2013.12.16 14:28
안드로이드 API를 파이어몽키에서 사용방법을 공유합니다. 제가 이해한 내용 기반으로 작성해서 틀린부분이 있을 수 있으니 혹시 틀린부분이 보이시면 댓글달아 주세요.

안드로이드 API 사용을 위해 파이어몽키로 변환할 대상은 안드로이드 Toast를 기반으로 설명하겠습니다.

Toast는 아래의 그림과 같이 하단에 잠시 나타났다가 사라지는 메시지입니다. 파이어몽키에는 제공하지 않습니다.



설명은 아래의 순서대로 진행하겠습니다.

1, 안드로이드 API 문서확인
2, 파이어몽키에서 안드로이드 API 접근 시 구성
3, 안드로이드 API 컨버팅
4, 사용법 및 샘플코드

안드로이드 API 문서확인

변환할 대상인 Toast의 안드로이드 문서는 아래 링크에서 확인 할 수 있습니다.


위쪽 문서는 API 문서구요, 아래의 문서는 샘플코드 문서입니다.


우선 위의 API문서를 보시면 대략 아래와 같은 단락으로 구성되어있으니 숙지해 주시구요.
  • Contants
  • Public Constructors
  • Public Methods - 
  • Inherited Methods
  • Fields(Toast에서는 미사용)


파이어몽키에서 안드로이드 API 접근 시 구성

unit Android.JNI.Toast;

interface

{$IFDEF ANDROID}
uses
  Androidapi.JNIBridge,
  Androidapi.JNI.JavaTypes,
  Androidapi.JNI.GraphicsContentViewText;

type
  JToast = interface;

  JToastClass = interface(JObjectClass)
  ['{F227353E-DCE9-404B-8129-6B1BEFE68151}']
    {Property methods}
    function _GetLENGTH_LONG: Integer; cdecl;
    function _GetLENGTH_SHORT: Integer; cdecl;
    {Methods}
    function init(context: JContext): JToast; cdecl; overload;
    function makeText(context: JContext; text: JCharSequence;
      duration: Integer): JToast; cdecl;
    {Properties}
    property LENGTH_LONG: Integer read _GetLENGTH_LONG;
    property LENGTH_SHORT: Integer read _GetLENGTH_SHORT;
  end;

  [JavaSignature('android/widget/Toast')]
  JToast = interface(JObject)
  ['{FC9B3DFD-38CC-4693-9F11-7F3E3647683F}']
    {Methods}
    procedure cancel; cdecl;
    function getDuration: Integer; cdecl;
    function getGravity: Integer; cdecl;
    function getHorizontalMargin: Single; cdecl;
    function getVerticalMargin: Single; cdecl;
    function getView: JView; cdecl;
    function getXOffset: Integer; cdecl;
    function getYOffset: Integer; cdecl;
    procedure setDuration(value: Integer); cdecl;
    procedure setGravity(gravity, xOffset, yOffset: Integer); cdecl;
    procedure setMargin(horizontalMargin, verticalMargin: Single); cdecl;
    procedure setText(s: JCharSequence); cdecl;
    procedure setView(view: JView); cdecl;
    procedure show; cdecl;
  end;
  TJToast = class(TJavaGenericImport<JToastClass, JToast>) end;
{$ENDIF}

implementation

end.


파이어몽키에서 Android API 사용하기 위해서는 JavaClass영역(JToastClass)과 JavaInterface영역(JToast)으로 구성 후 
실제 파이어몽키에서 사용할 수 있는 Class(TJToast)로 Generic형태로 Import해 사용합니다.
  • JToastClass - JavaClass interface
  • JToast - JavaInterface interface
  • TJToast - Delphi에서 사용할 Class

위와 같이 구성하기 위해서는 아래의 Unit들이 사용(uses)됩니다.
  • Androidapi.JNIBridge
  • Androidapi.JNI.JavaTypes
  • Androidapi.JNI.GraphicsContentViewText


안드로이드 API 컨버팅

델파이에서 구현할 부분은 크게 JavaClass와 JavaInterface입니다.

안드로이드 API문서를 보며 어느 부분을 JavaClass와 JavaInterface에 구현할지에 대해 알아보겠습니다.



위 그림의 붉은색 사각형에 포함된 내용이 JavaClass에 포함되고 나머지는 JavaInterface에 포함됩니다.


JavaClass 구현 할 항목

  JToast = interface;

  JToastClass = interface(JObjectClass)
  ['{F227353E-DCE9-404B-8129-6B1BEFE68151}']
    {Property methods}
    function _GetLENGTH_LONG: Integer; cdecl;
    function _GetLENGTH_SHORT: Integer; cdecl;
    {Methods}
    function init(context: JContext): JToast; cdecl; overload;
    function makeText(context: JContext; text: JCharSequence;
      duration: Integer): JToast; cdecl;
    {Properties}
    property LENGTH_LONG: Integer read _GetLENGTH_LONG;
    property LENGTH_SHORT: Integer read _GetLENGTH_SHORT;
  end;
  • Inherited Methods
    • JToastClass = interface(JObjectClass)와 같이 안드로이드 API에 기술된대로(java.lang.Object) interface를 상속받아 사용합니다.
  • Constants(상수)
    • 안드로이드 API 상수는 Properties로 구성되며 read 절에 _Get을 추가하여 선언됩니다.
    • 만약, END, BEGIN과 같은 상수는 &END, &BEGIN과 같이 &를 앞에 추가하여 구성됩니다.
    • Property methods에 _Get이 포함된 read 함수가 선언되며 호출규칙은 cdecl으로 지정합니다.
  • Public Constructors(생성자)
    • 생성자는 init();로 선언되며, 안드로이드의 인자를 그대로 선언해 줍니다.
      (JContext 등의 클래스는 이미 엠바카데로에서 선언(Androidapi.JNI.GraphicsContentViewText)해 놓았으니 매번 구현할 필요없이 잘 찾아서 사용하면 될것 같네요.)
    • 생성자도 cdecl로 호출규칙을 지정하고, Init는 JObjectClass에서 이미 구현되었으므로 overload로 method를 분개합니다.
    • JavaInterface를 반환합니다.(그래서 JToast = interface;를 미리 선언해야 합니다.)
  • Public Methods(Static)
    • Public Methods에 나열된 메소드 중에서 static으로 선언된 메소드들은 JavaClass에 선언해야 합니다.
    • 저는 static으로 선언된 메소드 중 2번째인 CharSequence text가 2번째 인자로 들어간 메소드만 사용했습니다.
      (모든 메소드를 모두 구현해야 할 필요는 없습니다.)

JavaInterface 구현 할 항목

  [JavaSignature('android/widget/Toast')]
  JToast = interface(JObject)
  ['{FC9B3DFD-38CC-4693-9F11-7F3E3647683F}']
    {Methods}
    procedure cancel; cdecl;
    function getDuration: Integer; cdecl;
    function getGravity: Integer; cdecl;
    function getHorizontalMargin: Single; cdecl;
    function getVerticalMargin: Single; cdecl;
    function getView: JView; cdecl;
    function getXOffset: Integer; cdecl;
    function getYOffset: Integer; cdecl;
    procedure setDuration(value: Integer); cdecl;
    procedure setGravity(gravity, xOffset, yOffset: Integer); cdecl;
    procedure setMargin(horizontalMargin, verticalMargin: Single); cdecl;
    procedure setText(s: JCharSequence); cdecl;
    procedure setView(view: JView); cdecl;
    procedure show; cdecl;
  end;

  TJToast = class(TJavaGenericImport<JToastClass, JToast>) end;

  • class path
    • 아래와 같이 API문서의 상단에서 class path를 확인하고 JavaSignature를 구성합니다.
  • Inherited Methods
    • JavaInterface도 JObject를 상속받습니다.
  • Public methods
    • Public methods에서 static으로 선언된 항목을 제외하고 선언합니다.
    • 대부분의 자료형은 이미 Androidapi.JNI.JavaTypes에 선언되었으나 해당 Unit을 참고합니다.


마지막으로 JavaClass(JToastClass)와 JavaInterface(JToast)를 TJavaGernericImport 클래스를 이용해서 실제로 사용할 Delphi class를 선언할 수 있습니다.


사용법 및 샘플코드

var
  Toast: JToast;
begin
  CallInUiThread(procedure
  begin
    Toast := TJToast.JavaClass.makeText(SharedActivityContext, StrToJCharSequence(AMsg), TJToast.JavaClass.LENGTH_SHORT);
    Toast.show;
  end);
end;


위의 코드가 Toast 메시지를 화면에 출력하는 샘플코드입니다.

안드로이드 가이드 문서를 참고해서 만들었습니다.


안드로이드 API를 구현한 후에는

TJToast.JavaClass이후에 JavaClass에 선언된 메소드들을 호출하고 반환받은 객체에서 JavaInterface의 메소드를 사용할 수 있습니다.


그리고, CallInUiThread의 경우  UI와 관련된 경우 Thread 처리하지 않으면 화면이 얼어버리는 현상이 발생해서 추가했습니다.

(그냥 구현했더니 얼어버려서, 엠바카데로 소스를 참고했습니다.)


마치며

대부분의 안드로이드 API는 이미 엠바카데로에서 구현해 놓았습니다.

(C:\Program Files (x86)\Embarcadero\RAD Studio\12.0\source\rtl\android 참고: 설치 기본경로 기준)


다만, 안드로이드에 특화된 기능등은 구현되지 않은 것이 있을 것입니다.

그럴경우 위에서 설명한 내용 참고하시면 충분히 포팅하여 사용할 수 있을것 같습니다.

(제 글이 도움이 되었으면 좋겠네요. 만약 어려운 부분이 있으시면 답글 주세요. 함께 고민해 보겠습니다.)


그럼 다음에는 iOS library 사용법이나 NDK 등의 글로 찾아뵙겠습니다.

감사합니다.

저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

험프리.김현수 험프리.김현수 파이어몽키 android api, Android to firemonkey, Firemonkey, JNI, toast

  1. 좋아요!! 많이 눌러주세요^^

  2. Blog Icon
    GHat

    안녕하세요 델파이 공부중인 한 학생입니다..
    델파이에서 안드로이드의 nfc 기능을 사용하려니 컴포넌트도없고...
    어떻게해야할지 막막합니다ㅠㅠ
    toast메세지 구현한것처럼 AndroidAPI 를 직접 가져다가 컨버팅해야할것같은데.. 어떻게해야할까요?

  3. 반갑네요^^ 델파이를 공부하신다고 하니...
    NFC 개발이 필요하다면 우선 NFC에 대한 정보를 먼저 익히시고 관련 샘플을 델파이로 컨버팅하며 익혀야 합니다.

  4. Blog Icon
    김주일

    안녕하세요 ?
    델파이는 잘 모르고 C 빌더를 사용하고 있는 사람 입니다.

    다른건 모두 이해가 가는데
    ['{F227353E-DCE9-404B-8129-6B1BEFE68151}'] 와
    ['{FC9B3DFD-38CC-4693-9F11-7F3E3647683F}'] 는

    어떻게 정해지는지 모르겠습니다 ?
    그리고 C Builder 로도 API 인터페이스가 가능한가요 ?


  5. 해당 문자열은 GUID이며 Ctrl + Alt + G를 누르면 세상에서 유일한 ID를 생성하고 사용할 수 있습니다.
    API 인터페이스 처리하는 부분은 C++빌더로도 가능합니다.
    (하지만 방법은 좀더 찾아보셔야 겠네요^^)

  6. 보고 따라했는데도 안되어서 파일을 그대로 가져다가 프로젝트에 올리고 uses절에서 호출하고.. 실행문 가져다가 했는데 빨간줄이 나옵니다..
    실행방법 알고 싶습니다..

    CallInUiThread
    SharedActivityContext
    StrToJCharSequence

    어디에 정의되있는건가요..?