C++ 예제 (Qt Android App 개발환경)

개요

이번 포스팅은 C++과 Qt를 이용해 안드로이드 앱을 만드는 과정을 진행할 계획입니다.

앱은 간단한 샘플로 제작하고, Qt를 이용해 C++ Android 개발환경을 구축하는 방법에 대해 집중해 보았습니다.

저 또한 데스크탑 환경이 아닌 낯선 모바일 개발환경을 처음 접했을 때, 이 부분이 가장 어려웠습니다.

결과부터 살펴보면 PC와 폰을 연결해 Qt의 Cross Platform 을 이용, Windows 플랫폼에서 개발->Android 플랫폼에서 실행으로 구성되어 있습니다.

[Windows 10, LG G7 연결]

[Qt 앱 실행화면]

물론 이 방법 외에도 안드로이드 앱을 만들 수 있는 개발환경은 다양합니다.

Android Studio(Java or Kotlin),  Microsoft Xamarin(C#) 등 선호하는 방법으로 개발환경은 스스로 선택하면 되겠습니다.

 

개발 환경 구축

이 예제는 Windows 10 Pro 64bit 운영체제에서 구성, 작성되었습니다.

더불어, 아래의 구성요소들이 필요합니다. 
  • Qt
  • Android Studio
  • Android NDK
  • Java JDK
 

1. Qt 설치

Qt는 C++로 만들어진 Class들의 집합이며, 크로스 플랫폼을 지원합니다.

GUI (Graphic User Interface) 개발에 주로 사용되지만, 네트워크, 블루투스, 3D, 쓰레드 등 다양한 분야의 클래스를 지원합니다.
 
설치 후 Qt의 통합개발환경인 Qt Creator를 통해 C++, Python 등의 개발이 가능합니다.
 
온라인 설치시 너무 느린 다운로드 속도 때문에 풀버전 설치시 2~3일도 걸려본적이 있는데, 요즘은 와~ 엄청 빨라졌습니다.

Qt 사이트 접속, 온라인 설치 파일을 다운로드 후 설치를 진행합니다.

Qt는 기본적으로 구입 (유료) 후 사용해야 하나, Open Source User를 위한 L(GPL) 라이센스를 지원하므로 비 상업적인 목적으로 소스코드를 공개한다면 무료 사용가능합니다.

1.1 안드로이드 체크

[Qt 설치 옵션, Qt]

1.2 MinGW 8.1 64bit 체크

[Qt 설치 옵션, Developer and Designer Tools]
 

2. Android Studio 설치

2.1 Android Studio 링크, 다운로드 후 설치

[Android Studio 다운로드]

2.2 설치 완료 후 Configure -> SDK Manager 선택

[Android Studio 설치 후 실행]

2.3 Android SDK 선택 후 설치 (참고로 제 폰은 Android 버전 10.0)

[SDK Platforms, 필요한 SDK 설치]

 

2.4 SDK Tools 탭에서 필요한 툴 설치 (Google USB Driver 필수)

[SDK Tools, 필요한 Tools 설치]

3. Android NDK 다운로드

Android NDK (Native Development Kit)는 Android에서 C, C++ 코드를 사용할 수 있게 해주는 도구 모음 입니다.
 
앞으로 C++로 제작된 Qt class를 이용해 Android 앱을 제작할 예정이므로 필요합니다.

설치파일 형태가 아닌 압축파일 형태로 제공되므로, 설치가 불필요하고 다운 받아 압축을 적당한 곳에 풀기만 하면 됩니다.

3.1 Android NDK 링크, 다운로드

[Android NDK 다운로드]

 

3.2 NDK 압축파일을 적당한 곳에 풀고 위치만 기억

[NDK 폴더 경로]
 

저는 Android Studio 가 설치된 C:\Uesr\AppData\Android\SDK\ 아래에 NDK 폴더를 만들어 두었지만 아무곳이나 상관은 없습니다.

사실 제가 설치한 Qt 5.15.1 버전에서는 Qt Option -> Device에서 NDK를 추가하는 기능이 존재하므로 이 과정은 불필요하지만, 이전 버전에서는 필요한 과정이었습니다.

위 그림에서 NDK 2가지가 설치되어 있는 이유도 Qt가 Android SDK 설정을 진행하며 NDK를 자신에 맞는 버전을 추가로 설치했기 때문입니다.


4. Java JDK 설치

Java JDK (Java Development Kit)는 자바 컴파일러와 클래스 라이브러리를 포함하는 자바 개발 환경 구축에 사용됩니다.

안드로이드 스튜디오는 자바언어를 기반으로 구동되기 때문에 꼭 필요한 과정입니다.

4.1 Java JDK 링크, 다운로드 후 설치 (오라클 회원가입, 계정 필요)

[Java JDK 다운로드]


5. Qt Creator Android 환경 설정

이제 개발 환경에 필요한 대부분의 설치는 끝났습니다.
 
다음은 Qt Creator의 Android Device 설정 부분에서 설치된 Android Studio, NDK의 설치 경로를 정해주어야 합니다.
 
마지막으로 Qt Creator의 Platform Kit에 오류 없이 등록되면, 드디어 코드개발이 가능합니다.

사실 이 부분 (Qt Creator 설정)에서 많은 or 절망적인 오류를 만나게 됩니다.

이 글을 적다 보니 이건 뭐 코드를 작성하는 일보다 개발 환경 설정하는 일이 더 큰, 마치 주객이 전도되어 배보다 배꼽이 더 큰거 아닌가하는 생각도 듭니다.

하지만 끝까지 차근차근 진행해 보겠습니다.

5.1 Qt Creator 실행 -> 메뉴 Tools -> Devices 선택
 
[Devices -> Android 탭 선택]



5.2 Java Settings 경로설정
 
이전 과정에서 설치한 Java JDK 경로를 설정하고, "Java settings are OK" 확인.
 
친절하게 최신버전의 Qt는 JDK 링크 버튼도 만들어 두었네요.

[Java JDK 경로 설정]

 
5.3 Android Settings 경로설정

이전에 설치해둔 Android Studio의 경로를 설정하면, NDK는 Qt가 알아서 설정하고 필요한 경우 자동으로 NDK 다운로드가 진행 됩니다.
 
단, 아래 그림처럼 "안드로이드 툴 체인 자동 생성"에 체크해 두어야 합니다.
 
[툴 체인 자동생성 체크]

 
여기서도 설정이 완료되면 "Android settings are OK." 를 확인합니다.

[Android SDK, NDK 경로 설정]


5.4 Android OpenSSL 경로 설정 (옵션)

SSL은 네트워크에서 소켓을 통해 전송되는 패킷에 대해 통신보안 측면에서 암호를 적용하는 표준 규약입니다.
 
다만, 옵션이고 이 예제에는 불필요하므로 설치하지 않았습니다.

홈페이지 로그인, 이메일 접속, 파일전송 등 네트워크 통신시 소켓을 이용해 데이터를 주고 받게 됩니다.
 
이때 소켓 연결이 이루어진 직후, SSL을 이용, 앞으로 소켓을 통해 Send, Receive 되는 데이터에 암호화를 하지 않는다면 로그인 시 입력하는 ID, PW가 패킷 상에 그대로 노출되고, 이를 방지하기 위함 입니다.

설치하지 않아도 이후 과정에 문제는 없습니다.

[Android openSSL 설정]


5.5 Android AVD 설정
 
AVD (Android Virtual Device) 는 Android 용으로 개발된 앱을 가동 테스트해볼 가상 장치 (에뮬레이터)를 뜻합니다.
 
응용프로그램을 만들었더라도, 실행할 장치, 환경이 없다면 곤란하겠죠.
 
다양한 종류의 안드로이드 실제폰을 버전별로 모두 준비해 앱을 테스트하기가 힘들기 때문에 여기서 앱을 실행할 가상의 장치 등록이 가능합니다.

저는 Android 10 버전의 장치를 하나 등록해 두었습니다. 

이 에뮬레이터를 켜고, 개발한 앱을 실행하면 아래와 같이 실제 폰에 앱을 실행한 것처럼 동작하게 됩니다.
 
[AVD에서 실행한 앱]
 
아래 그림에서 Add 버튼으로 필요한 에뮬레이터를 추가합니다.
 
여기까지 진행되었다면 Device의 모든 설정은 끝입니다.
 
[AVD 추가]

5.6 Qt Kit 설정
 
이제 Android 개발환경 설정의 마지막 과정, Kit 설정입니다.
 
Kit는 크로스 플랫폼을 지원하는 Qt의 특징적인 부분으로 여기에 등록된 Kit을 선택, 적용해 해당 플랫폼에서 구동되는 앱 개발이 가능합니다.

즉 완성된 앱을 플랫폼별 코드 수정 등 커스터 마이징 없이 바로 Kit을 변경해 Android 용으로 배포가 가능합니다.
 
사실, 이전 과정까지 문제없이 진행되었더라도 Kit 설정에서 오류를 많이 만나게 됩니다. 저는 특히 이 부분에서 자주 오류를 접했습니다.

문제가 없다면 아래와 같이 보여지게 됩니다.
 
문제가 있는 경우는 Kit의 아이콘이 빨강 or 노랑으로 보여지며 컴파일 과정에서 오류를 만나게 됩니다.

[Qt Kit 설정]
 

제가 게시물을 작성하며 경험해 본 오류는 아래와 같습니다.

  • Android Kit 이 노란색으로 2개가 생성.

 안드로이드 Kit의 컴파일러 설정이 각 arm, x86 2개로 따로 잡히는데, 그 Kit의 이름이 동일해 발생하는 오류 (x86 kit은 그 이름에 _x86을 붙여 따로 설정 후 OK)

[kit 이름 충돌 방지]

  • MinGW Compiler 버전 8.1 미만인 경우

Qt Document를 참조하면, 안드로이드 5.0이상은 MinGW 버전 8.1 설치 필요

[Qt 참조 문서]

[Qt Creator MinGW Compiler 설정]

여기까지 문제가 없다면 드디어 Android 개발환경이 끝났습니다.

이제 코드만 짜서 돌려보면 됩니다.


 

소스코드

1. Qt Creator Project 생성

Qt Creator를 실행하고 새 프로젝트를 생성합니다.


1.1 Qt Widgets Application 선택
 

 
1.2 Project 이름, 위치 설정
 

 
1.3 Build System 설정 (qmake)
 

 
1.4 Class Infomation 설정 (QWidget)

QMainWindow (상단메뉴, 하단작업표시줄 사용가능), QDialog (대화상자, 모달리스 가능) 를 선택해도 무관합니다.

일반적으로 Qt Project는 QMainWindow, QWidget, QDialog 3가지 중 하나를 선택해 그 기반으로 생성됩니다.
 
이 글의 예제 코드는 QWidget으로 제작되었습니다.

Microsoft MFC의 단일문서(SDI), 다중문서(MDI), 대화장자(Dialog) 와 비슷한 개념입니다.
 

 
1.5 Translation File 설정 (None)
 

 
1.6 Kit Selection 설정 (스마트폰 CPU Architecture에 따라)

저는 arm 계열(LG G7)이라 Clang arm complier Kit으로 설정



2. Qt Creator Project 코드 작성

main.cpp 파일은 수정할 내용이 없습니다.
 
아래 코드는 main함수에서 생성되는 Widget class (QWidget에서 상속) 코드입니다.
 
간단히 "Hello World"을 위젯 상단에 적고, 선을 대각선으로 그리는 샘플앱을 작성합니다.
 
2.1 widget.h 소스코드

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <qlabel.h>
#include <QVBoxLayout>

class QPainter;

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:    
    QLabel m_label;
    QVBoxLayout m_vbox;

protected:
    void paintEvent(QPaintEvent* e);
};
#endif // WIDGET_H

  • QLabel 객체와 배치를 위한 QVBoxLayout 객체 선언
  • QPainter class 전방 선언 (포인터인 경우 가능)
  •  QWidget paintEvent() 함수 재정의 (위젯 갱신시 호출)

 

2.2 widget.cpp 소스코드

#include "widget.h"
#include "ui_widget.h"
#include <qpainter.h>

Widget::Widget(QWidget *parent) : QWidget(parent) 
{    
    m_label.setText("Hello World");
    m_label.setAlignment(Qt::AlignTop|Qt::AlignHCenter);
    m_vbox.addWidget(&m_label);
    this->setLayout(&m_vbox);

}

Widget::~Widget()
{
}

void Widget::paintEvent(QPaintEvent *e)
{
    Q_UNUSED(e)

    QPainter qp;
    qp.begin(this);

    QRectF rect(this->rect());
    qp.drawLine(rect.topLeft(), rect.bottomRight());
    qp.drawLine(rect.topRight(), rect.bottomLeft());

    qp.end();
} 

생성자 함수 코드 서명

  •  생성자에 라벨 문자열 설정, 정렬
  • 수직 레이아웃 박스에 라벨 추가
  • 위젯에 레이아웃 박스 배치

 

paintEvent() 함수 코드 설명

  • QPainter 객체 생성
  •  drawLine() 함수로 양쪽 대각선 선 그리기

 

3. Qt Creator Project 컴파일, 실행

이제는 전 단계에서 작성한 앱을 안드로이드에서 실행시키는 과정입니다.
 
드디어 힘들게 구축한 안드로이드 개발환경의 동작여부를 확인해 볼 수 있겠군요.
 
실제 폰에서 실행하고자 하는 경우 아래와 같이 사전 설정 필요.
  • 실제 폰 해당 제조사 (삼성, LG 등) USB 드라이버를 설치하고 개발자 모드 사용
  • 개발자 모드에서 USB 디버깅 허용
 
컴파일하면 디바이스 선택창이 뜨고, 대상 디바이스를 선택하면 됩니다.

제 폰인 LG G7과 AVD로 구성한 에뮬레이터가 보입니다.
 
[AVD or 스마트폰]
  
3.1 에뮬레이터 실행
 
디바이스 설정을 AVD로 선택

[에뮬레이터 실행시 결과]

 
 
3.2 실제 폰에 실행

개발자 모드로 연결된 폰에서 실행
 
[실제 폰에서 앱 실행]

에뮬레이터, 실제폰 모두 이상없이 동작함을 확인 할 수 있습니다.

이상으로 모든 설명을 마칩니다.

감사합니다.


"Qt6 를 이용한 Android 앱개발" 글을 최근 (2023.09) 업데이트 하였습니다.

댓글

이 블로그의 인기 게시물

Qt Designer 설치하기

C++ 예제 (소켓 서버, 이미지, 파일전송)