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

제품문의

ADC Tech 이동선 대표(02-459-2022, leetom@unitel.co.kr)

 

라이브러리 준비 및 분석

안드로이드와 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<byte>;

  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<byte>(WrapJNIArray(ObjID, TypeInfo(TJavaArray<byte>)));

  JData := TJString.JavaClass.init(JBytes, 0, JBytes.Length);

  Result := JStringToString(JData);

end;

 

var

  Data: string;

begin

  Data := JObjectToStr(msg.obj);

end;</byte></byte></byte>

 

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

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

 

델파이 설치 경로 하위 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의 댓글을 참고하거나 등록해주세요.

번호 제목 글쓴이 날짜 조회 수
공지 [DelphiCon 요약] 코드사이트 로깅 실전 활용 기법 (Real-world CodeSite Logging Techniques) 관리자 2021.01.19 24059
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 22359
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 24408
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 30269
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 31398
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 26723
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 47736
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 184681
130 11월 26일 "RAD Studio XE5 따라잡기: 모바일 개발 퀵스타트 LIVE!" 발표자료입니다. file 관리자 2013.12.03 3633
129 [추가된 문법 정리] - 배열 상수 초기화:델파이 XE7 추가 관리자 2016.06.03 3565
128 Release Notes for XE5 Update 1 c2design 2013.10.29 3408
127 CodeRage 8: Delphi 온라인 무료 세미나 개최 관리자 2013.10.15 3389
126 델파이, 25년의 혁신 - 버전 1부터 10.3까지 버전별 핵심 기능 [2] 관리자 2020.05.12 3332
125 [따라하기] 도서대여 프로그램 만들기 - 5, 도서대여 기능 개발 file 험프리 2017.02.02 3316
124 XE7에서 추가 된 안드로이드 프로젝트에서 외부 라이브러리(jar) 사용을 위한 정보 [1] Humphery 2014.11.03 3265
123 QR/바코드 스캐너 앱 샘플코드(ZXing, TFrameStand 사용) [1] 험프리 2017.08.04 3205
122 [개발 예제] 웹 소켓 서버&클라이언트 채팅 프로그램 관리자 2021.06.08 3021
121 브레이크 포인트를 설정해도 디버깅이 안되는 경우 살펴볼 항목 file 험프리 2016.05.13 3000
120 Developer Direct LIVE! 모바일 썸머 스쿨!! 관리자 2013.07.06 2979
119 [델파이7 이후 새로운 기능] 코딩 생산성을 높여주는 코드에디터 기능들 Humphery 2015.04.21 2856
118 [10.3 리오] 델파이 언어의 새로운 변화: 인라인 변수 선언 관리자 2018.11.12 2831
» 블루투스 바코드 스캐너(BI-07) 안드로이드 라이브러리를 델파이에서 연동하는 방법 [1] file 험프리 2017.03.24 2799
116 엔터프라이즈 데이터 기반의 모바일 앱 과정(2일) 우선 등록 안내 관리자 2013.11.21 2748
115 델파이 문법을 익힐 수 있는 문서모음 [2] Humphery 2014.11.03 2725
114 델파이 개체를 메모리에서 해제할 때 Free와 FreeAndNil의 차이점 김원경 2017.02.01 2707
113 델파이를 이용해 구글크롬캐스트와 연결 Humphery 2014.07.22 2657
112 [XE7] Castalia로 델파이 코딩 생산성을 높일 수 있습니다.(XE7사용자 무료제공) Humphery 2014.12.09 2652
111 [따라하기] 도서대여 프로그램 만들기 - 2, 메인화면 개발 [2] file 험프리 2017.01.26 2605