C ++ 및 Android 기본 활동 시작하기

소개

간단한 Android 기본 활동을 설정하는 방법을 안내하고 싶습니다. 기본 설정을 살펴보고 앞으로 나아가는 데 필요한 도구를 제공하려고합니다.

내 초점은 게임에 있지만 OpenGL 응용 프로그램을 작성하는 방법이나 게임 엔진을 설계하는 방법에 대해서는 설명하지 않겠습니다. 그것은 말 그대로 책을 채우는 토론입니다.

왜 C ++인가

Android에서 OS 및 지원 인프라는 Java 또는 Kotlin 프로그래밍 언어로 작성된 애플리케이션을 지원하도록 설계되었습니다. 이러한 언어로 작성된 응용 프로그램은 시스템의 기본 아키텍처에 깊이 내장 된 도구의 이점을 누립니다. Android UI 및 인 텐트 처리와 같은 많은 핵심 Android 시스템 기능은 Java 인터페이스를 통해서만 노출됩니다.

C ++를 사용하기로 선택하면 Kotlin 또는 Java와 같은 관리 언어를 사용하는 것보다 Android에 "더 기본"되지 않습니다. 직관적으로 반박하면 사용 가능한 Android 기능의 하위 집합 만 사용하여 외부 애플리케이션을 작성하는 방법이 있습니다. 대부분의 애플리케이션에서는 Kotlin과 같은 언어를 사용하는 것이 좋습니다.

이 규칙에는 몇 가지 예외가 있습니다. 내 마음에 가장 가까운 것은 게임 개발입니다. 게임은 일반적으로 OpenGL 또는 Vulkan으로 작성되는 사용자 지정 렌더링 로직을 사용하므로 게임이 표준 Android 애플리케이션과 다르게 보일 것으로 예상됩니다. 또한 C 및 C ++가 모든 컴퓨팅 플랫폼에 거의 보편적이고 게임 개발을 지원하는 상대적으로 풍부한 C 라이브러리를 고려할 때 네이티브 개발 경로를 시작하는 것이 합리적 일 수 있습니다.

처음부터 게임을 만들거나 기존 게임을 포팅하려는 경우 Android의 기본 개발 키트 (또는 NDK) 및 지원 도구가 준비되어 기다리고 있습니다. 실제로 제가 보여 드릴 기본 활동은 OpenGL 캔버스를 설정하고 사용자 입력 수집을 시작할 수있는 간편한 원 스톱 상점을 제공합니다. C의인지 오버 헤드에도 불구하고 게임 데이터에서 정점 속성 배열을 빌드하는 것과 같은 몇 가지 일반적인 코드 문제가 상위 수준 언어보다 C ++에서 더 쉬워진다는 것을 알 수 있습니다.

내가 다루지 않을 것

Vulkan 또는 OpenGL 컨텍스트 를 초기화하는 방법을 보여 드리지 않겠습니다 . Google에서 제공 하는 샘플을 읽어 보는 것이 좋지만 , 여러분의 삶을 더 편하게 만드는 몇 가지 팁을 제공하겠습니다. 대신 SDL 또는 Google의 FPLBase 와 같은 라이브러리를 대신 사용할 수 있습니다 .

IDE 설정

먼저 네이티브 개발을 위해 모든 것이 설치되어 있는지 확인해야합니다. 이를 위해서는 Android NDK가 필요합니다. Android Studio를 시작합니다.

"구성"에서 "SDK 관리자"를 선택합니다.

여기에서 LLDB (네이티브 디버거), CMake (우리가 사용할 빌드 시스템) 및 NDK 자체를 설치합니다.

프로젝트 만들기

이제 모든 설정이 완료되었으므로 프로젝트를 생성합니다. 활동이없는 빈 프로젝트를 만들고 싶습니다.

NativeActivity는 Gingerbread 이후 Android에 있었지만 방금 배우는 중이라면 당시 사용 가능한 가장 높은 대상을 선택하는 것이 좋습니다.

이제 C ++ 프로젝트를 빌드하는 방법을 Android에 알리기 위해 CMakeLists.txt를 만들어야합니다. 프로젝트보기에서 앱을 마우스 오른쪽 버튼으로 클릭하고 새 파일을 만듭니다.

명명 된 CMakeLists.txt :

그리고 간단한 CMake 파일을 만듭니다.

우리는 Android Studio (3.6.0)에서 최신 CMake를 사용하고 있으며 helloworld-c라는 공유 라이브러리를 구축하고 있다고 말합니다. 우리가 만들어야 할 소스 파일도 추가했습니다.

왜 실행 파일이 아닌 공유 라이브러리입니까? Android는 Zygote라는 프로세스를 사용하여 Android 런타임 내에서 애플리케이션 또는 서비스를 시작하는 프로세스를 가속화합니다. 이는 Android의 모든 사용자 대면 프로세스에 적용되므로 앱에서 코드를 실행할 수있는 첫 번째 기회는 실제로 관리되는 VM 내부에 있습니다. 그런 다음 관리 코드는 논리가 포함 된 공유 라이브러리 파일을로드해야합니다. 이는 네이티브 활동을 사용하는 경우 처리됩니다. 반대로 실행 파일을 빌드 할 때 운영 체제가 프로그램을 직접로드하고 "main"이라는 C 함수를 실행할 것으로 예상됩니다. 이것은 Android에서 가능 하지만 실용적인 용도를 찾지 못했습니다.

이제 C ++ 파일을 생성합니다.

그리고 make 파일에서 지정한 디렉토리로 재배치합니다.

그리고 그것이 올바르게 구축되고 있는지 알려주는 작은 것을 넣어 봅시다 :

마지막으로 C ++ 프로젝트를 애플리케이션에 연결해 보겠습니다.

모든 것이 잘되면 프로젝트가 성공적으로 업데이트됩니다.

문제없이 빌드를 실행할 수 있습니다.

빌드 스크립트에서 변경된 사항에 관해서. 앱의 build.gradle을 열면 다음 externalNativeBuild항목이 표시됩니다.

네이티브 활동 만들기

활동은 기본적으로 Android가 앱에 대한 인터페이스를 표시하는 창입니다. 일반적으로 Activity를 확장하는 Java 또는 Kotlin으로 클래스를 작성하지만 Google은 네이티브 액티비티라는 특수한 C 기능을 만들었습니다.

빌드 파일 설정

네이티브 활동을 만드는 가장 좋은 방법은 native_app_glue. 많은 샘플이 SDK에서 프로젝트로 복사합니다. 이것에 문제는 없지만 제자리에두고 이것을 내 게임이 의존하는 라이브러리로 만드는 것이 개인적 선호입니다. 동적 라이브러리 호출의 추가 비용을 지불하지 않도록 이것을 STATIC 라이브러리로 만들 것입니다.

있어 많은 여기 분해하기 때문에 시작할 수 있습니다. 먼저 add_library라는 라이브러리를 만들고 라이브러리로 native_app_glue표시합니다 STATIC. 그런 다음 ${ANDROID_NDK}NDK 설치에서 일부 파일을 찾기 위해 자동으로 생성 된 환경 변수 를 찾습니다. 이를 사용하여 native_app_glue : 구현을 가져옵니다 android_native_app_glue.c.

내 코드를 대상과 연결 한 후 대상이 헤더 파일을 찾는 위치를 말하고 싶습니다. 내가 사용 target_include_directories의 모든 헤더와 폴더에 끌어와 이들을 표시 PUBLIC헤더. 다른 옵션 INTERNAL또는 PRIVATE해당 범위는 현재 관련이 없습니다. 일부 자습서 include_directories에서는 target_include_directories. 이것은 오래된 관행입니다. 최신 버전 target_include_directories에서는 디렉터리를 대상과 연결할 수 있으므로 대규모 프로젝트의 복잡성을 줄이는 데 도움이됩니다.

이제 Android의 LogCat에 항목을 기록 할 수 있기를 원합니다. 표준 출력 (예 : std::cout또는 printf)에 쓰기 만하면 일반 C 및 C ++ 애플리케이션 에서처럼 잘 작동하지 않습니다. 를 사용 find_library하여 log나중에 참조 할 수 있도록 Android의 로깅 라이브러리를 캐시합니다.

마지막으로 CMake helloworld-cnative_app_glue,,를 사용하여 android호출 한 라이브러리 에 의존 하도록 지시 합니다. 이를 통해 C ++ 프로젝트에서 네이티브 앱 로직을 참조 할 수 있습니다. 호출하기 전에 또한 helloworld를-C라는 함수를 구현하지 않습니다 있는지 확인한다 에 의해 제공됩니다 .log-libtarget_link_librariessetadd_libraryANativeActivity_onCreate,android_native_app_glue

간단한 네이티브 활동 작성

이제 준비가 되었으니 앱을 만들어 보겠습니다!

여기서 무슨 일이 일어나고 있습니까?

먼저를 사용 extern "C"{}하여 링커에게 중괄호 사이의 모든 것을 C로 처리해야한다고 말하고 있습니다. 여전히 내부에 C ++ 코드를 작성할 수 있지만 나머지 프로그램에서는 함수가 C 함수처럼 보입니다.

작은 자리 표시 자 함수를 만들고 있습니다 handle_cmd. 이것은 향후 메시지 루프 역할을 할 것입니다. 모든 터치 이벤트, 창 이벤트, & c가 여기를 통과합니다.

프로그램의 핵심은 android_main입니다. android_native_app_glue애플리케이션이 시작될 때 호출됩니다 . pApp->onAppCmd시스템 메시지가 갈 곳이 있도록 메시지 루프 를 가리키는 것으로 시작합니다 .

다음으로 ALooper_pollAll대기중인 모든 시스템 이벤트를 처리 하는 데 사용 하며 첫 번째 인수는 시간 초과입니다. 0보다 크거나 같은 값을 얻으면 pSource이벤트 처리 를 도와야 합니다. 그렇지 않으면 앱이 닫힐 때까지 계속합니다.

여전히이 활동을 실행할 수는 없지만 모든 것이 정상인지 확인하기 위해 자유롭게 구축하십시오.

ApplicationManifest에 필수 정보 추가

이제 AndroidManifest.xml을 작성하여 시스템에 앱 실행 방법을 알려야합니다. app> manifests> AndroidManfiest.xml에서 찾을 수 있습니다.

먼저 Android android에 네이티브 액티비티 ( 'android.app.NativeActivity'라고 함)에 대해 알리고 방향 변경이나 키보드 상태 변경에 대한 액티비티를 파괴하지 않도록 알려줍니다.

그런 다음 실행할 코드를 찾을 위치를 네이티브 액티비티에 알려줍니다. 이름을 잊은 경우 CMakeLists.txt를 확인하십시오!

그리고 Android 운영 체제에 이것이 런처 활동 및 주요 활동임을 알려줍니다.

모든 것이 잘되면 디버그를 누르고 빈 창을 볼 수 있습니다!

OpenGL 준비

Google 샘플 저장소에는 이미 우수한 OpenGL 샘플이 있습니다.

시작하는 데 도움이되는 몇 가지 힌트를 제공합니다. 먼저 OpenGL을 사용하려면 CMakeLists.txt에 다음 줄을 추가하세요.

다양한 Android 플랫폼에 대해 여기에서 수행 할 수있는 훨씬 더 많은 인텔리전스가 있지만 EGL 및 GLESv3를 대상에 추가하는 것은 최신 버전의 Android에서는 괜찮습니다.

다음으로 Renderer렌더링 처리를 위해 호출되는 클래스를 만들고 싶습니다 . 렌더러를 초기화하는 생성자,이를 파괴하는 소멸자, render()렌더링 할 함수를 사용하여 생성하는 경우 앱을 다음과 같이 만드는 것이 좋습니다.

그래서, 제가 한 첫 번째 일은 android_appcalled 에서이 작은 필드를 사용하기 시작하는 것 userData입니다. 여기에 원하는 것을 하나라도 저장할 수 있으며, 모든 인스턴스가이를 android_app얻을 수 있습니다. 렌더러를 추가하기로 결정했습니다.

다음으로, 윈도우가 초기화 된 후에 만 ​​렌더러를 가질 수 있으며, 그것이 파괴되면 제거해야합니다. handle_cmd이 작업을 수행하기 위해 앞서 말씀 드린 기능을 사용합니다 .

마지막으로 렌더러 (즉 : 창이 생성 된 경우)가 있으면이를 검색하고 android_app렌더링하도록 요청합니다. 그렇지 않으면이 루프를 계속 처리합니다.

결론

이제 다른 플랫폼에있는 것처럼 OpenGL ES 3를 사용할 준비가되었습니다! 더 많은 리소스 나 튜토리얼이 필요한 경우 유용한 링크는 다음과 같습니다.

Suggested posts

늦은 밤 고백 — Rust, Rocket, Diesel 및 Askama를 사용하여 웹 사이트 구축 — 1 부

늦은 밤 고백 — Rust, Rocket, Diesel 및 Askama를 사용하여 웹 사이트 구축 — 1 부

오전 1시 (🎵 부드러운 재즈 음악)입니다. 당신은 잠을 자려고 침대에 누워 있습니다.

Flow / LiveData…. 무엇입니까? 최상의 사용 사례. (로그인 시스템 구축)

Flow / LiveData…. 무엇입니까? 최상의 사용 사례. (로그인 시스템 구축)

현대의 안드로이드 개발자로서 "라이브 데이터"또는 "플로우"라는 단어를 여러 번 접했을 것입니다. 관련 기사가 너무 많지만 대부분이 '사용'사례를 무시하고 초보자가 라이브 데이터를 이해하기 어렵다고 생각합니다. 라이브 데이터는 기본적으로 강력한 설계를 지원하는 라이브러리 모음 인 Android 아키텍처 구성 요소의 일부입니다. 테스트 및 유지 관리가 가능한 앱.

Related posts

"실용적인 프로그래머"의 5 가지 필수 사항

역대 베스트셀러 코딩 북의 요점

"실용적인 프로그래머"의 5 가지 필수 사항

Pragmatic Programmer는 1999 년에 처음 출판되었으며 이후 역대 최고의 프로그래밍 책으로 선정되었습니다. 저자 Andy Hunt와 David Thomas는 Agile Manifesto의 원저자 중 하나였으며 몇 가지 심각한 자격을 가지고 있습니다.

대규모 GraphQL 쿼리 공격으로부터 보호

공격자가 공개적으로 사용 가능한 GraphQL 인터페이스를 사용하여 사이트를 스크랩하거나 서비스 거부 공격을 실행하는 방법에 대해 알아보십시오. 이들은 4 가지 방법 중 하나로이를 수행 할 수 있습니다. 단일 대형 쿼리를 신중하게 구성하여 실행하고, 관련 데이터를 가져올 수있는 병렬 쿼리를 많이 작성하고, 일괄 요청을 사용하여 많은 쿼리를 연속적으로 실행하고, 마지막으로 많은 요청을 보냅니다.

기술 인터뷰의 사회적 구성 요소

코딩 문제는 스트레스가 많지만 스트레스에 대한 당신의 반응은 당신의 기술적 능력보다 더 크게 말합니다.

기술 인터뷰의 사회적 구성 요소

기술 업계의 직책을 위해 인터뷰 할 때 일반적으로 제안을 고려하기 전에 최소한 3 차례의 인터뷰를 거치게됩니다. 라운드는 일반적으로 다음과 같습니다. 그렇게 생각하면 잘못된 것입니다.

훌륭한 개발자의 3 가지 행동 특성

훌륭한 개발자의 3 가지 행동 특성

훌륭한 개발자를 만드는 비 기술적 인 것들 나는이 기사를 작성하는 것을 한동안 미루고 있습니다. 나는 그것을 작성할 자격이 있다고 생각하지 못했습니다. 오늘은 쓸 때라고 생각했습니다.