Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ прилоТСния Android Native Activity

Twitter LinkedIn Facebook АдрСс элСктронной ΠΏΠΎΡ‡Ρ‚Ρ‹

  • Π‘Ρ‚Π°Ρ‚ΡŒΡ

ПослС установки кроссплатформСнной Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° языкС C++ Visual Studio ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для создания ΠΏΠΎΠ»Π½ΠΎΡ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Android Native Activity. ΠŸΠ°ΠΊΠ΅Ρ‚ Android Native Development Kit (NDK) β€” это Π½Π°Π±ΠΎΡ€ срСдств, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ возмоТностСй прилоТСния Android, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ чистый ΠΊΠΎΠ΄ C ΠΈΠ»ΠΈ C++. Для обСспСчСния взаимодСйствия ΠΊΠΎΠ΄Π° C ΠΈΠ»ΠΈ C++ с Android ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Java JNI, Π²Ρ‹ΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΠΉ Π² Ρ€ΠΎΠ»ΠΈ ΡΠ²ΡΠ·ΡƒΡŽΡ‰Π΅Π³ΠΎ. Π’ Android NDK появилась Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ прилоТСния Native Activity с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ API Android уровня 9. Код Native Activity популярСн для создания ΠΈΠ³Ρ€ΠΎΠ²Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ с интСнсивным использованиСм Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ Π½Π° основС Unreal Engine ΠΈΠ»ΠΈ OpenGL. Π’ этом пошаговом руководствС ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ созданиС простого прилоТСния Native Activity, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ OpenGL. Π’ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ€Π°Π·Π΄Π΅Π»Π°Ρ… ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ‚Π°ΠΊΠΈΠ΅ этапы ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, ΠΊΠ°ΠΊ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, сборка, ΠΎΡ‚Π»Π°Π΄ΠΊΠ° ΠΈ Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° Native Activity.

ВрСбования

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Android Native Activity, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»ΠΈ всС систСмныС трСбования ΠΈ установили Ρ€Π°Π±ΠΎΡ‡ΡƒΡŽ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° языкС C++ Π² Visual Studio. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ свСдСния см. Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ Установка Visual C++ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ кроссплатформСнных ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° языкС C++. Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ сторонниС инструмСнты ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹Β SDK Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π² установку, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ‡Ρ‚ΠΎ установлСн эмулятор Android.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Native Activity

Π’ этом руководствС Π²Ρ‹ сначала создадитС Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Android Native Activity, Π° Π·Π°Ρ‚Π΅ΠΌ создадитС ΠΈ запуститС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² эмуляторС Android.

  1. Π’ Visual Studio Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Π€Π°ΠΉΠ»>Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ>ΠŸΡ€ΠΎΠ΅ΠΊΡ‚.

  2. Π’ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠΌ ΠΎΠΊΠ½Π΅ Новый ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π² мСню Π¨Π°Π±Π»ΠΎΠ½Ρ‹ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅

    Visual C++>ΠšΡ€ΠΎΡΡΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ шаблон ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Native-Activity (Android).

  3. ΠŸΡ€ΠΈΡΠ²ΠΎΠΉΡ‚Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ имя, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ MyAndroidApp, Π° Π·Π°Ρ‚Π΅ΠΌ Π½Π°ΠΆΠΌΠΈΡ‚Π΅ OK.

    Visual Studio создаст Π½ΠΎΠ²ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΈ ΠΎΡ‚ΠΊΡ€ΠΎΠ΅Ρ‚ ΠΎΠ±ΠΎΠ·Ρ€Π΅Π²Π°Ρ‚Π΅Π»ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ.

  1. Π’ Visual Studio Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Π€Π°ΠΉΠ»>Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ>ΠŸΡ€ΠΎΠ΅ΠΊΡ‚.

  2. Π’ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠΌ ΠΎΠΊΠ½Π΅ Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ шаблон

    ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Native-Activity (Android), Π° Π·Π°Ρ‚Π΅ΠΌ Π½Π°ΠΆΠΌΠΈΡ‚Π΅ Π”Π°Π»Π΅Π΅.

  3. Π’ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠΌ ΠΎΠΊΠ½Π΅ ΠΠ°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π²Π²Π΅Π΄ΠΈΡ‚Π΅ имя, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ MyAndroidApp Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Имя ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ.

    Visual Studio создаст Π½ΠΎΠ²ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΈ ΠΎΡ‚ΠΊΡ€ΠΎΠ΅Ρ‚ ΠΎΠ±ΠΎΠ·Ρ€Π΅Π²Π°Ρ‚Π΅Π»ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ.

Π’ Π½ΠΎΠ²ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ прилоТСния Android Native Activity входят Π΄Π²Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

  • MyAndroidApp.NativeActivity содСрТит ссылки ΠΈ ΡΠ²ΡΠ·ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ для запуска прилоТСния ΠΊΠ°ΠΊ прилоТСния Native Activity Π½Π° Android. РСализация Ρ‚ΠΎΡ‡Π΅ΠΊ Π²Ρ…ΠΎΠ΄Π° ΠΈΠ· ΠΊΠΎΠ΄Π° glue находятся Π² main.cpp. ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ скомпилированныС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ находятся Π²

    Ρ„Π°ΠΉΠ»Π΅ pch.h. Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ прилоТСния native Activity компилируСтся Π² Ρ„Π°ΠΉΠ» SO ΠΎΠ±Ρ‰Π΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выбираСтся ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ.

  • MyAndroidApp.Packaging создаСт Ρ„Π°ΠΉΠ» с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ .apk для развСртывания Π½Π° устройствС ΠΈΠ»ΠΈ Π² эмуляторС Android. Он содСрТит рСсурсы ΠΈ Ρ„Π°ΠΉΠ»AndroidManifest.xml , Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π·Π°Π΄Π°ΡŽΡ‚ΡΡ свойства манифСста. Он Ρ‚Π°ΠΊΠΆΠ΅ содСрТит Ρ„Π°ΠΉΠ»build.xml , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ управляСт процСссом сборки Ant. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΠ½ Π·Π°Π΄Π°Π½ ΠΊΠ°ΠΊ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΈ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ нСпосрСдствСнно ΠΈΠ· Visual Studio.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈ запуск прилоТСния Android Native Activity ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°ΠΉΡ‚Π΅ ΠΈ запуститС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, созданноС шаблоном, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ установку ΠΈ настройку. Для ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ тСста запуститС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· ΠΏΡ€ΠΎΡ„ΠΈΠ»Π΅ΠΉ устройств, установлСнных эмулятором Android. Если Π²Ρ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°Π΅Ρ‚Π΅ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅, Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚Π΅ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ эмулятор ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ устройство ΠΊ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Ρƒ.

Π‘Π±ΠΎΡ€ΠΊΠ° ΠΈ запуск прилоТСния Native Activity ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

  1. Если ΠΎΠ½ Π΅Ρ‰Π΅ Π½Π΅ Π²Ρ‹Π±Ρ€Π°Π½, Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ x86 Π² Ρ€Π°ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΌΡΡ спискС ΠŸΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ .

    Если список ΠŸΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½Π΅ отобраТаСтся, Ρ‰Π΅Π»ΠΊΠ½ΠΈΡ‚Π΅ ΠΏΡƒΠ½ΠΊΡ‚ ΠŸΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΈΠ· Ρ€Π°ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ списка Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΈ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ свою ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡƒ.

  2. Π’ строкС мСню ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Π‘Π±ΠΎΡ€ΠΊΠ°>Π‘ΠΎΠ±Ρ€Π°Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅.

    Π’ ΠΎΠΊΠ½Π΅ «Π’Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅» отобразятся Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ процСсса сборки для Π΄Π²ΡƒΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Π² Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ.

  3. Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΡ€ΠΎΡ„ΠΈΠ»Π΅ΠΉ эмулятора Android Π² качСствС Ρ†Π΅Π»ΠΈ развСртывания.

    Если Π²Ρ‹ установили Π΄Ρ€ΡƒΠ³ΠΈΠ΅ эмуляторы ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΠΈ устройство Android, Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΈΡ… Π² Ρ€Π°ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΌΡΡ спискС ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ развСртывания.

  4. НаТмитС ΠΊΠ»Π°Π²ΠΈΡˆΡƒ F5 , Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ, ΠΈΠ»ΠΈ SHIFT+F5 , Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π±Π΅Π· ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ.

    Π’ΠΎΡ‚ ΠΊΠ°ΠΊ выглядит ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² эмуляторС Android.

    Visual Studio запускаСт эмулятор, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π° нСсколько сСкунд Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ ΠΈ Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠΎΠ΄. ПослС запуска прилоТСния ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΠΈ останова ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΊΠΎΠ΄Π°, языковых стандартов ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.

  5. НаТмитС ΠΊΠ»Π°Π²ΠΈΡˆΡƒ SHIFT+F5 , Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ.

    Эмулятор являСтся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ процСссом, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ, ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ нСсколько Ρ€Π°Π· Π² ΠΎΠ΄Π½ΠΎΠΌ эмуляторС.

ИспользованиС ΠΊΠΎΠ΄Π° C ΠΈ C ++ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Android с NDK

Π’ этом ΡƒΡ€ΠΎΠΊΠ΅ я ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡŽ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ для вашСго ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Android, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ идСально ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для ΠΊΠΎΠΌΠ°Π½Π΄ с унаслСдованным ΠΊΠΎΠ΄ΠΎΠΌ ΠΈΠ»ΠΈ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΌΠΈΡΡ знаниями Π² C ΠΈ C ++. Android Native Development Kit (NDK) являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡ€Π° инструмСнтов Google, ΠΈ ΠΌΡ‹ рассмотрим, ΠΊΠΎΠ³Π΄Π° NDK ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π΅Π½ ΠΈ ΠΊΠ°ΠΊ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ для Android.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΠ”Πš?

NDK – это Π½Π°Π±ΠΎΡ€ инструмСнтов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ прилоТСния для Android с использованиСм C, C ++ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ€ΠΎΠ΄Π½Ρ‹Ρ… языков ΠΊΠΎΠ΄Π°, компилируя ΠΊΠΎΠ΄ Π² прилоТСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π° устройствах Android. ИспользованиС NDK, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π½Π΅ рСкомСндуСтся, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ прилоТСния ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΡ‹Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ сниТСниС ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, ΡΡ‚Ρ€Π°Π΄Π°Ρ‚ΡŒ ΠΎΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ совмСстимости, Π·Π°Ρ‚Ρ€ΡƒΠ΄Π½ΡΡ‚ΡŒ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ ΠΈ ΡΠ½ΠΈΠΆΠ°Ρ‚ΡŒ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ. Π’ΠΎ, Ρ‡Ρ‚ΠΎ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ NDK, – это ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ слоТности прилоТСния ΠΈ возмоТности ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈΠ·-Π·Π° взаимодСйствия с Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ.

ΠŸΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅ высказывания ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΠ±Π΅ΡΠΊΡƒΡ€Π°ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌΠΈ, Π½ΠΎ Π΅ΡΡ‚ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования NDK. Π­Ρ‚ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ прилоТСния, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΠΈΠ³Ρ€Ρ‹, ΠΈΠ³Ρ€ΠΎΠ²Ρ‹Π΅ Π΄Π²ΠΈΠΆΠΊΠΈ, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ сигналов ΠΈ физичСскиС симуляции. Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования – ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ использованиС ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, написанных Π½Π° C / C ++. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ собствСнного ΠΊΠΎΠ΄Π°, доступных ΠΎΠ½Π»Π°ΠΉΠ½.

Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ±Π°Π»Π°Π½ΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ»ΡŽΡΡ‹ ΠΈ минусы использования NDK, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ, стоит Π»ΠΈ это Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ слоТности. Π’Ρ‹ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡΠ½ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ своС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΠΌ Π²Π°ΠΌΠΈ языкС, Π΄Π°ΠΆΠ΅ Ссли Π²Ρ‹ ΡΠ²Π»ΡΠ΅Ρ‚Π΅ΡΡŒ экспСртом Π² C ΠΈΠ»ΠΈ C ++.

ИспользованиС NDK

Android Studio

Если Ρƒ вас Π΅Π³ΠΎ Π΅Ρ‰Π΅ Π½Π΅Ρ‚, Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚Π΅ Android Studio , ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΡƒΡŽ IDE ΠΎΡ‚ Google.

ΠŸΠ°ΠΊΠ΅Ρ‚ ΠΠ”Πš

Android Studio Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ стандартныС инструмСнты ΠΈ SDK, поэтому Π·Π°Π³Ρ€ΡƒΠΆΠ°ΠΉΡ‚Π΅ ΠΈ устанавливайтС ΠΏΠ°ΠΊΠ΅Ρ‚ NDK ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ. Π•ΡΡ‚ΡŒ Π΄Π²Π° способа ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈ самый простой – это опция автоматичСской установки Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ SDK . Π­Ρ‚ΠΎ большая Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° (~ 1 Π“Π‘), поэтому ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Ρƒ вас Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π΅ ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚-соСдинСниС ΠΈ / ΠΈΠ»ΠΈ Ρ‚Π΅Ρ€ΠΏΠ΅Π½ΠΈΠ΅.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ способ – Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ NDK Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ со страницы Π·Π°Π³Ρ€ΡƒΠ·ΠΎΠΊ NDK . Π­Ρ‚ΠΎ экономит Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя ΠΈΠ·-Π·Π° мСньшСго Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ (<.5 Π“Π‘), Π½ΠΎ ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ настройки. Π—Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ NDK для вашСй ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ ΠΈ слСдуйтС инструкциям ΠΏΠΎ установкС. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½Π½Ρ‹ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΊΡƒΠ΄Π° ΡƒΠ³ΠΎΠ΄Π½ΠΎ, Π½ΠΎ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅ это мСстополоТСниС, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΎ понадобится Π²Π°ΠΌ ΠΏΠΎΠ·ΠΆΠ΅.

ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ΠΌΠΈΡ€

Π”Π°Π²Π°ΠΉΡ‚Π΅ запустим тСстовый ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π»ΠΈ установка NDK. Папка ΠΏΠ°ΠΊΠ΅Ρ‚Π° NDK содСрТит ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹, Π½ΠΎ, ΠΏΠΎΡ…ΠΎΠΆΠ΅, ΠΎΠ½ΠΈ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ β€œΠΈΠ· коробки” Π² Android Studio Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ настройки. ВмСсто этого ΠΌΡ‹ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ ΠΎΠ±Ρ€Π°Π·Ρ†Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с экрана привСтствия . Π­Ρ‚ΠΈ ΠΎΠ±Ρ€Π°Π·Ρ†Ρ‹ NDK ΠΈΠ· GitHub Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Ρ‹ ΠΈΠ»ΠΈ ΠΊΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ. Π­Ρ‚Π° коллСкция ΠΎΠ±Ρ€Π°Π·Ρ†ΠΎΠ² Π»ΡƒΡ‡ΡˆΠ΅ совмСстима с послСднСй вСрсиСй Android Studio.

Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Β« Π˜ΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π° AndroidΒ» ΠΈ Π²Π²Π΅Π΄ΠΈΡ‚Π΅ hello Π² ΠΏΠΎΠ»Π΅ поиска, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Ρ‚ΡŒ список. Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Hello JNI ΠΈΠ· ΠΎΡ‚Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ списка Π² ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ Ndk . НаТмитС Β« Π”Π°Π»Π΅Π΅Β», Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ имя прилоТСния ΠΈ мСстополоТСниС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Π·Π°Ρ‚Π΅ΠΌ Π½Π°ΠΆΠΌΠΈΡ‚Π΅ Β« Π“ΠΎΡ‚ΠΎΠ²ΠΎΒ» .

JNI

ПослС Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΊΠΎΠ΄Π° ΠΈ синхронизации Gradle, Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΡƒΡŽ структуру ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Π’Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ нСсоотвСтствиС Π² Π½Π°Π·Π²Π°Π½ΠΈΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΎΠ½ называСтся HelloJNI, Π° Π½Π΅ HelloNDK ? Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Β«JNIΒ» ΠΈ Ρ‡Π΅ΠΌ ΠΎΠ½ отличаСтся ΠΎΡ‚ Β«NDKΒ»? «БобствСнный интСрфСйс JavaΒ» – это инфраструктура, которая позволяСт прилоТСниям Java Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с собствСнным ΠΊΠΎΠ΄ΠΎΠΌ. JNI ΠΈ NDK Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ вмСстС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Π²ΡΡ‚Ρ€ΠΎΠ΅Π½Π½ΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Android. NDK являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ Android, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ JNI доступСн для любого прилоТСния Java, Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Android.

Π’Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° находится ΠΏΠ°ΠΏΠΊΠ° с ΠΈΠΌΠ΅Π½Π΅ΠΌ jni, которая Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ вСсь исходный ΠΊΠΎΠ΄ прилоТСния Π½Π° C ΠΈΠ»ΠΈ C ++. JNI обСспСчиваСт двусторонний интСрфСйс. Код C / C ++ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ Java, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ стандартныС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Android, Π° ΠΊΠΎΠ΄ Java ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ собствСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π² ΠΊΠΎΠ΄Π΅ C / C ++. БобствСнный ΠΊΠΎΠ΄ рСгулируСтся Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅ пСсочницами ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌΠΈ бСзопасности, Ρ‡Ρ‚ΠΎ ΠΈ ΠΊΠΎΠ΄ Java, поэтому Ρƒ прилоТСния Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ Π½Π΅ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ доступа ΠΊ ΠΎΠ±ΠΎΡ€ΡƒΠ΄ΠΎΠ²Π°Π½ΠΈΡŽ. Для Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ³ΠΎ обсуТдСния JNI, ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ JNI с сайта Android Developer .

ABI

Π”Π°Π²Π°ΠΉΡ‚Π΅ создадим ΠΈ запустим ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π½Π° эмуляторС ΠΈΠ»ΠΈ экспортируСм APK для тСстирования Π½Π° устройствС. Π’ΠΎΡ‚ hello-jni, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ Π½Π° ΠΌΠΎΠ΅ΠΌ Asus Zenfone, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ интСрфСйс ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Intel ΠΈΠ»ΠΈ x86 (ABI). Когда ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ взаимодСйствуСт с собствСнным ΠΊΠΎΠ΄ΠΎΠΌ, ΠΎΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ ЦП. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ скомпилирован для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π΅Π³ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ABI соотвСтствуСт Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅ΠΉ, ΠΊΠ°ΠΊ собствСнный ΠΊΠΎΠ΄ прилоТСния Π΄ΠΎΠ»ΠΆΠ΅Π½ вСсти сСбя ΠΈΠ»ΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с систСмой Π²ΠΎ врСмя выполнСния. Π’ настоящСС врСмя NDK ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ ARMEABI (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ), MIPS ΠΈ x86. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ, Π° собствСнный ΠΊΠΎΠ΄ создаСтся для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹. Об этом ΡƒΠΆΠ΅ заботятся Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, поэтому просто ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΎΠ±Ρ€Π°Π·Π΅Ρ† ΠΈ установитС Π΅Π³ΠΎ Π² качСствС ΠΎΡ‚ΠΏΡ€Π°Π²Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Π’ Π½Π΅ΠΌ ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ всС основныС трСбования, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠ³Π»ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с NDK.

ΠŸΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ использованиС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ

Как ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Ρ€Π°Π½Π΅Π΅, сила NDK Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Π΅Π³ΠΎ способности ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅, ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹Π΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΈ ΠΌΠΎΡ‰Π½Ρ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ C / C ++. Π­Ρ‚Π° функция находится Π½Π° ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ стадии Π² Android Studio ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ рСкомСндуСтся для ΠΎΠΏΡ‹Ρ‚Π½Ρ‹Ρ… Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ². Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, это Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ интСрСсноС ΠΈ Π·Π°ΡΠ»ΡƒΠΆΠΈΠ²Π°ΡŽΡ‰Π΅Π΅ изучСния.

SDL

Simple DirectMedia Layer – это Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹Ρ… абстракций с ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ исходным ΠΊΠΎΠ΄ΠΎΠΌ, выпущСнная 18 Π»Π΅Ρ‚ Π½Π°Π·Π°Π΄. Он ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² основном для ΠΈΠ³Ρ€, Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для всСго, Ρ‡Ρ‚ΠΎ связано с Π²Ρ‹ΡΠΎΠΊΠΎΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠΉ. Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ создадим Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ SDL ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² качСствС шаблона для Π±ΠΎΠ»Π΅Π΅ слоТных ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ.

Настройка ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ шагом являСтся Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° исходного ΠΊΠΎΠ΄Π° SDL со страницы Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ исходного ΠΊΠΎΠ΄Π° ΠΈΠ»ΠΈ ΠΊΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ рСпозитория Mercurial с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ:

hg clone http://hg.libsdl.org/SDL

ПослС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈΠ»ΠΈ клонирования ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Android (с ΠΈΠΌΠ΅Π½Π΅ΠΌ android-project ) ΠΈΠ· ΠΏΠ°ΠΏΠΊΠΈ SDL Π² Android Studio, принимая значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π° экранах ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°. ПослС создания ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° синхронизации, связанная с ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ вСрсиСй SDK. Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ SDK Manager ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ SDK для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС Android 3.1 (API Level 12). УстановитС Ρ„Π»Π°ΠΆΠΎΠΊ ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ свСдСния ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ эту Π²Π΅Ρ€ΡΠΈΡŽ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½Π° ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Π° ΠΊΠ°ΠΊ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ°Ρ. МоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΡΠ²Π΅ΠΆΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ, Π½ΠΎ ΠΏΠΎΠΊΠ° Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΈΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ Android-12, Ρ‡Ρ‚ΠΎΠ±Ρ‹ всС Π±Ρ‹Π»ΠΎ просто.

ПослС установки SDK ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π±Π΅Π· ошибок, отобраТая сообщСниС BUILD SUCCESSFUL Π½Π° консоли. Если Π²Ρ‹ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΠ»ΠΈΡΡŒ с ΠΊΠ°ΠΊΠΈΠΌΠΈ-Π»ΠΈΠ±ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ошибками, поТалуйста, Π΄Π°ΠΉΡ‚Π΅ ΠΌΠ½Π΅ Π·Π½Π°Ρ‚ΡŒ Π² коммСнтариях.

Gradle

Android Studio ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Gradle , систСму Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ сборки с ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ исходным ΠΊΠΎΠ΄ΠΎΠΌ для управлСния ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌΠΈ ΠΈ ΠΈΡ… Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ. Π‘ΠΎΠ»ΡŒΡˆΠ°Ρ Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° происходит Π² Ρ„Π°ΠΉΠ»Π°Ρ… Gradle. Π”Π°Π²Π°ΠΉΡ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Ρ€ΡƒΡ‡Π½ΡƒΡŽ настройку Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚.

ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ build.gradle (ΠΌΠΎΠ΄ΡƒΠ»ΡŒ прилоТСния) ΠΈ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ ΠΏΠΎΠ΄ свойством buildToolsVersion

    sourceSets {
        main {
            jni.srcDirs = []
        }
    }

Π­Ρ‚ΠΎ скроСт собствСнный ΠΊΠΎΠ΄ Π² ΠΏΡ€ΠΎΠ²ΠΎΠ΄Π½ΠΈΠΊΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ SDL ΠΈ собствСнный ΠΊΠΎΠ΄ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ndk-buildΠΏΠ°ΠΏΠΊΠΈ ndk-bundle . Π‘Π±ΠΎΡ€ΠΊΠ° собствСнного ΠΊΠΎΠ΄Π° Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ – Π±ΠΎΠ»Π΅Π΅ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ сборками с использованиСм Android Studio ΠΈ Gradle. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Gradle для NDK всС Π΅Ρ‰Π΅ являСтся ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ, ΠΈ Π½Π΅ всС Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ использования ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ.

БимволичСская ссылка

Π”Π°Π²Π°ΠΉΡ‚Π΅ создадим ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ссылку Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΠ°ΠΏΠΊΠΈ app / src / main / jni / ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. НазовитС Π΅Π³ΠΎ SDL ΠΈ ΡƒΠΊΠ°ΠΆΠΈΡ‚Π΅ Π΅Π³ΠΎ Π½Π° ΠΏΠ°ΠΏΠΊΡƒ SDL, Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΡƒΡŽ ΠΈΠ»ΠΈ ΠΊΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Ρ€Π°Π½Π΅Π΅. Папка SDL ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ скопирована Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, Π½ΠΎ этот ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΌΠ΅Π½Π΅Π΅ эффСктивСн ΠΈ ΠΏΠΎΠ΄Π²Π΅Ρ€ΠΆΠ΅Π½ ошибкам. Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ скрыты Π² Android Studio, поэтому ΠΈΡ… Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π²ΠΎ внСшнСм Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅ для внСсСния ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.

Android.mk

Android.mk – это простой Ρ„Π°ΠΉΠ» make, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ описываСт исходный ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈ ΠΎΠ±Ρ‰ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ для систСмы сборки. ΠŸΡ€ΠΎΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΆΠ΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½, ΠΈΠΌΠ΅Π΅Ρ‚ эти Ρ„Π°ΠΉΠ»Ρ‹ создания ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π½ΠΎ с минимальной Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ. Π”Π°Π²Π°ΠΉΡ‚Π΅ внСсСм измСнСния Π² Ρ„Π°ΠΉΠ» Android.mk основного прилоТСния. Π­Ρ‚ΠΎΡ‚ Ρ„Π°ΠΉΠ» находится Π² ΠΏΠ°ΠΏΠΊΠ΅ app / src / main / jni / src . НайдитС строку с надписью YourSourceHere.cmain.c

Application.mk

Π€Π°ΠΉΠ» make Application.mk содСрТит ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ, ΠΎΠ±Ρ‰ΡƒΡŽ для всСх ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, ΠΈ влияСт Π½Π° сборку всСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ строку Π² Application.mk Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΠ°ΠΏΠΊΠΈ app / src / main / jni / :

APP_PLATFORM := android-12

Π­Ρ‚ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ свойства сообщаСт ndk-build Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ для измСнСния Π² Application.mk – это Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ†Π΅Π»Π΅Π²Ρ‹Π΅ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ свойство APP_ABI Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΈΠ»ΠΈ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΈΡ… всС:

  • arm64-V8A
  • armeabi
  • armeabi-v7a
  • MIPS
  • MIPS64
  • x86
  • x86_64

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ для всСх этих ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ Π΄Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ Π±ΠΎΠ»Π΅Π΅ ΡˆΠΈΡ€ΠΎΠΊΠΈΠΉ ΠΎΡ…Π²Π°Ρ‚, Π½ΠΎ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ получится Π±ΠΎΠ»Π΅Π΅ ΠΊΡ€ΡƒΠΏΠ½Ρ‹ΠΉ APK.

main.c

ПослСдний шаг – Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ SDL ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π΅Π³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π»ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. Для удобства Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ этот Ρ„Π°ΠΉΠ» main.c , загруТая Π΅Π³ΠΎ Π² ΠΏΠ°ΠΏΠΊΡƒ app / src / main / jni / src .

ΠžΡ‚ΠΊΡ€Ρ‹Π² main.c , Π²Ρ‹ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΎΠ½ пытаСтся Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ с ΠΈΠΌΠ΅Π½Π΅ΠΌ image.bmp . Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ это, создайтС ΠΏΠ°ΠΏΠΊΡƒ с ΠΈΠΌΠ΅Π½Π΅ΠΌ asset Π²Π½ΡƒΡ‚Ρ€ΠΈ app / src / main ΠΈ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ растровоС ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ с ΠΈΠΌΠ΅Π½Π΅ΠΌ image.bmp . Π― использовал Π»ΠΎΠ³ΠΎΡ‚ΠΈΠΏ SitePoint.com для этого тСста.

Π‘Π±ΠΎΡ€ΠΊΠ° ΠΈ запуск

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π», ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ app / src / main / jni / ΠΈ запуститС ndk-build NDK_LIBS_OUT=../jniLibs Π­Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° создаСт собствСнный ΠΊΠΎΠ΄ ΠΈ сохраняСт ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΎΠ±Ρ‰Π΅Π³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ( .so ) Π² ΠΏΠ°ΠΏΠΊΡƒ jniLibs . Если ndk-build ПослС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ сборки ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ΡΡŒ Π½Π° Android Studio ΠΈ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ запуститС ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΡƒΠ½ΠΊΡ‚ мСню БСрвис -> Android -> Π‘ΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ Gradle . APK Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡƒΠ½ΠΊΡ‚Π° мСню Build -> Build APK, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° устройствС ΠΈΠ»ΠΈ эмуляторС. Π’ΠΎΡ‚ моя сборка, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π°Ρ Π½Π° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅ x86:

Π’Ρ‹Π²ΠΎΠ΄

Как ΠΌΡ‹ ΡƒΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ, использованиС NDK с Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ для Android Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹, Π½ΠΎ приносит Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π». НадСюсь, я ΠΏΠΎΠΊΠ°Π·Π°Π» Π²Π°ΠΌ достаточно, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ, ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ Π»ΠΈ ΠΎΠ½ для вашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈΠ»ΠΈ Π½Π΅Ρ‚.

Π― Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ ΡƒΡΠ»Ρ‹ΡˆΠ°Ρ‚ΡŒ ваш ΠΎΠΏΡ‹Ρ‚ ΠΈ мнСния ΠΎΠ± использовании ΠΊΠΎΠ΄Π° C ΠΈ C ++ с Android NDK Π² коммСнтариях Π½ΠΈΠΆΠ΅.

Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΊΠΎΠ΄ C ΠΈ C++ | Android Studio

Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΊΠΎΠ΄ C ΠΈ C++ Π² свой ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Android, помСстив ΠΊΠΎΠ΄ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ cpp Π² вашСм ΠΌΠΎΠ΄ΡƒΠ»Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Когда Π²Ρ‹ строитС свой ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, это ΠΊΠΎΠ΄ компилируСтся Π² Π½Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Gradle ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Ρ‚ΡŒ с вашим ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ. Π—Π°Ρ‚Π΅ΠΌ ваш ΠΊΠΎΠ΄ Java ΠΈΠ»ΠΈ Kotlin ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² вашСй Ρ€ΠΎΠ΄Π½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅. Ρ‡Π΅Ρ€Π΅Π· собствСнный интСрфСйс Java (JNI). Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС ΠΎΠ± использовании JNI Framework, ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ совСты JNI для Андроид.

Android Studio ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ CMake, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ для кроссплатформСнных ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ². Android Studio Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ndk-build , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ быстрСС, Ρ‡Π΅ΠΌ CMake, Π½ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Android. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠ°ΠΊ CMake, Ρ‚Π°ΠΊ ΠΈ ndk-build Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ ΠΌΠΎΠ΄ΡƒΠ»Π΅ Π² настоящСС врСмя Π½Π΅ поддСрТиваСтся.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ ndk-build Π² Π²Π°ΡˆΡƒ Android Studio ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, Π½Π°ΡƒΡ‡ΠΈΡ‚Π΅ΡΡŒ свяТитС Gradle с вашим Ρ€ΠΎΠ΄Π½Ρ‹ΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.

На этой страницС ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Android Studio с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ инструмСнты сборки, создайтС Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π½Π° C/C++ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΈ добавляйтС Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π½ΠΎΠ²Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ C/C++.

Если вмСсто этого Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ собствСнный ΠΊΠΎΠ΄ Π² ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, Π‘Π»Π΅Π΄ΡƒΠΉ этим шагам:

  1. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π½ΠΎΠ²Ρ‹Π΅ собствСнныС исходныС Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π² ваш ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Android Studio.
    • ΠŸΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚Π΅ этот шаг, Ссли Ρƒ вас ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ собствСнный ΠΊΠΎΠ΄ ΠΈΠ»ΠΈ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π½Π½ΡƒΡŽ Π½Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ.
  2. НастройтС CMake для встройтС свой собствСнный исходный ΠΊΠΎΠ΄ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ. Π­Ρ‚ΠΎΡ‚ скрипт сборки трСбуСтся Ссли Π²Ρ‹ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ ΠΈ связываСтС Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ ΠΈΠ»ΠΈ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½Ρ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.
    • Если Ρƒ вас Π΅ΡΡ‚ΡŒ собствСнная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡƒΠΆΠ΅ CMakeLists.txt скрипт сборки ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ndk-build ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Android.mk скрипт сборки, пропуститС этот шаг.
  3. ΠΠ°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Gradle, ΡƒΠΊΠ°Π·Π°Π² ΠΏΡƒΡ‚ΡŒ ΠΊ Π²Π°ΡˆΠ΅ΠΌΡƒ CMake ΠΈΠ»ΠΈ ndk-build . Ρ„Π°ΠΉΠ» сцСнария. Gradle ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ скрипт сборки для ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° исходного ΠΊΠΎΠ΄Π° Π² ваш ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ Android Studio ΠΈ ΡƒΠΏΠ°ΠΊΡƒΠΉΡ‚Π΅ свою ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.

ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²Ρ‹ настроитС свой ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ доступ ΠΊ своим собствСнным функциям ΠΈΠ· Код Java ΠΈΠ»ΠΈ Kotlin с использованиСм Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° JNI. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π½Π°ΠΆΠΌΠΈΡ‚Π΅ Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ .

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Если Π² ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚ ndkCompile , ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π½Π° использованиС CMake ΠΈΠ»ΠΈ ndk-сборка .

Π—Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚Π΅ NDK ΠΈ инструмСнты сборки

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΈΡ‚ΡŒ собствСнный ΠΊΠΎΠ΄ для вашСго прилоТСния, Π²Π°ΠΌ потрСбуСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹:

  • Π ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ для Android (NDK): Π½Π°Π±ΠΎΡ€ инструмСнтов, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ C ΠΈ C++ с Андроид. NDK прСдоставляСт Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ собствСнными дСйствий ΠΈ доступа ΠΊ физичСским ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌ устройства, Ρ‚Π°ΠΊΠΈΠΌ ΠΊΠ°ΠΊ Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠΈ ΠΈ сСнсорныС Π²Ρ…ΠΎΠ΄.
  • CMake: внСшний инструмСнт сборки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ вмСстС с Gradle для создания собствСнного Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°. Π’Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ΅Π½ этот ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, Ссли Π²Ρ‹ ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ndk-сборка .
  • LLDB: ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ Π² Android Studio, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚Π»Π°ΠΆΠΈΠ²Π°Π΅Ρ‚ Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΊΠΎΠ΄.

БвСдСния ΠΎΠ± установкС этих ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² см. Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Установка ΠΈ настройка NDK ΠΈ CMake.

Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ C/C++

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ собствСнного ΠΊΠΎΠ΄Π°, процСсс Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ созданиС любого Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Android Π‘Ρ‚ΡƒΠ΄ΠΈΠΉΠ½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, Π½ΠΎ с Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ шагом:

  1. Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ мастСра Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ свой ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ , Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Ρ‚ΠΈΠΏ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Native C++ .
  2. НаТмитС Π”Π°Π»Π΅Π΅ .
  3. Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ поля Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ мастСра.
  4. Π©Π΅Π»ΠΊΠ½ΠΈΡ‚Π΅ Π”Π°Π»Π΅Π΅ .
  5. Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ мастСра Customize C++ Support ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ваш ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ с ΠΏΠΎΠ»Π΅ΠΌ C++ Standard .
    • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ€Π°ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉΡΡ список, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅, ΠΊΠ°ΠΊΡƒΡŽ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚ΠΈΠ·Π°Ρ†ΠΈΡŽ C++ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. Π’Ρ‹Π±ΠΎΡ€ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ инструмСнтов По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ настройку CMake ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.
  6. Π©Π΅Π»ΠΊΠ½ΠΈΡ‚Π΅ Π“ΠΎΡ‚ΠΎΠ²ΠΎ .

ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Android Studio Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ созданиС Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ Project Π² Π»Π΅Π²ΠΎΠΉ части IDE ΠΈ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Android Π²ΠΈΠ΄ ΠΈΠ· мСню. Как ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° рисункС 1, Android Studio добавляСт Π³Ρ€ΡƒΠΏΠΏΡƒ cpp :

Рисунок 1. Π³Ρ€ΡƒΠΏΠΏ прСдставлСний Android для собствСнных источников ΠΈ внСшниС скрипты сборки.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π­Ρ‚ΠΎ прСдставлСниС Π½Π΅ ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅Ρ‚ Ρ„Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ„Π°ΠΉΠ»ΠΎΠ²ΡƒΡŽ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΡŽ. Π½Π° дискС, Π½ΠΎ Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠΎΡ…ΠΎΠΆΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΡŽ ΠΏΠΎ Π²Π°ΡˆΠ΅ΠΌΡƒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ.

Π’ Π³Ρ€ΡƒΠΏΠΏΠ΅ cpp Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ всС Ρ€ΠΎΠ΄Π½Ρ‹Π΅ исходныС Ρ„Π°ΠΉΠ»Ρ‹, Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ, скрипты сборки для CMake ΠΈΠ»ΠΈ ndk-build ΠΈ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‡Π°ΡΡ‚ΡŒΡŽ вашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Для Π½ΠΎΠ²Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Android Studio создаСт ΠΎΠ±Ρ€Π°Π·Π΅Ρ† исходного Ρ„Π°ΠΉΠ»Π° C++, native-lib.cpp , ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π΅Π³ΠΎ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ src/main/cpp/ вашСго модуля прилоТСния. Π­Ρ‚ΠΎΡ‚ ΠΎΠ±Ρ€Π°Π·Π΅Ρ† ΠΊΠΎΠ΄ прСдоставляСт ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ C++, stringFromJNI() , Ρ‡Ρ‚ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ строку "ΠŸΡ€ΠΈΠ²Π΅Ρ‚ с C++" . Π£Π·Π½Π°ΠΉΡ‚Π΅, ΠΊΠ°ΠΊ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ исходныС Ρ„Π°ΠΉΠ»Ρ‹ Π² ваш ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ собствСнныС исходныС Ρ„Π°ΠΉΠ»Ρ‹.

Подобно Ρ‚ΠΎΠΌΡƒ, ΠΊΠ°ΠΊ Ρ„Π°ΠΉΠ»Ρ‹ build.gradle ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΈΡ€ΡƒΡŽΡ‚ Gradle, ΠΊΠ°ΠΊ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, CMake ΠΈ ndk-build Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ скрипта сборки, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ ваша родная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°. Для Π½ΠΎΠ²Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Android Studio создаСт сборку CMake. script, CMakeLists.txt ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π΅Π³ΠΎ Π² ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ вашСго модуля. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС ΠΎ содСрТимом этого скрипта сборки, ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ НастройтС CMake.

Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΈ запуститС ΠΎΠ±Ρ€Π°Π·Π΅Ρ† прилоТСния

Когда Π²Ρ‹ Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚Π΅ , запускаСтС , Android Studio создаСт ΠΈ запускаСт ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ тСкст Β«ΠŸΡ€ΠΈΠ²Π΅Ρ‚ с C++Β» Π½Π° вашСм Android-устройство ΠΈΠ»ΠΈ эмулятор. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΎΠ±Π·ΠΎΡ€Π΅ описаны события, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ происходит для сборки ΠΈ запуска ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° прилоТСния:

  1. Gradle Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ваш внСшний скрипт сборки, CMakeLists.txt .
  2. CMake слСдуСт ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌ Π² сцСнарии сборки для компиляции исходного ΠΊΠΎΠ΄Π° C++. Ρ„Π°ΠΉΠ», Π½Π°Ρ‚ΠΈΠ²-lib.cpp , Π² ΠΎΠ±Ρ‰ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ ΠΈΠΌΠ΅Π½Π° это libnative-lib.so . Π—Π°Ρ‚Π΅ΠΌ Gradle ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ Π΅Π³ΠΎ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.
  3. Π’ΠΎ врСмя выполнСния ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ MainActivity Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ собствСнный Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° с использованиСм System. loadLibrary() . Родная функция Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, stringFromJNI() , Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ доступно для прилоТСния.
  4. MainActivity.onCreate() Π²Ρ‹Π·ΠΎΠ²Ρ‹ stringFromJNI() , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ "Hello from C++" ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ для обновлСния TextView .

Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Gradle ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ Π½Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Анализатор APK:

  1. Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Build > Build Bundle(s) / APK(s) > Build APK(s) .
  2. Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Β«Π‘Π±ΠΎΡ€ΠΊΠ° Β» > «Анализ APK Β».
  3. Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ APK ΠΈΠ»ΠΈ AAB ΠΈΠ· ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° app/build/outputs/. ΠΈ Π½Π°ΠΆΠΌΠΈΡ‚Π΅ OK .
  4. Как ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° рисункС 2, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ libnative-lib.so Π² Окно APK Analyzer ΠΏΠΎΠ΄ lib// .

    Рисунок 2. НайдитС ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ APK Анализатор.

Π‘ΠΎΠ²Π΅Ρ‚: Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ прилоТСниями Android, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ собствСнный ΠΊΠΎΠ΄, Π½Π°ΠΆΠΌΠΈΡ‚Π΅ File > New > Import Sample ΠΈ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΎΠ±Ρ€Π°Π·Π΅Ρ† ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈΠ· списка Ndk .

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²Ρ‹Ρ… исходных Ρ„Π°ΠΉΠ»ΠΎΠ² C/C++

Π§Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ исходныС Ρ„Π°ΠΉΠ»Ρ‹ C/C++ Π² ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ дСйствия:

  1. Если Ρƒ вас Π΅Ρ‰Π΅ Π½Π΅Ρ‚ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° cpp/ Π² основном источникС Π½Π°Π±ΠΎΡ€ вашСго прилоТСния, создайтС Π΅Π³ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:
    1. ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ панСль Project Π² Π»Π΅Π²ΠΎΠΉ части IDE ΠΈ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Π² мСню Π²ΠΈΠ΄ Project .
    2. ΠŸΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ ΠΊ ваш-ΠΌΠΎΠ΄ΡƒΠ»ΡŒ > src .
    3. Π©Π΅Π»ΠΊΠ½ΠΈΡ‚Π΅ ΠΏΡ€Π°Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ ΠΌΡ‹ΡˆΠΈ основной ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΠΈ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ > Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΈΠΊ .
    4. Π’Π²Π΅Π΄ΠΈΡ‚Π΅ cpp Π² качСствС ΠΈΠΌΠ΅Π½ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° ΠΈ Π½Π°ΠΆΠΌΠΈΡ‚Π΅ OK .
  2. Π©Π΅Π»ΠΊΠ½ΠΈΡ‚Π΅ ΠΏΡ€Π°Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ ΠΌΡ‹ΡˆΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ cpp/ ΠΈ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ > Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» C/C++ .
  3. Π’Π²Π΅Π΄ΠΈΡ‚Π΅ имя исходного Ρ„Π°ΠΉΠ»Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ native-lib .
  4. Π’ мСню Π²Π²Π΅Π΄ΠΈΡ‚Π΅ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° для исходного Ρ„Π°ΠΉΠ»Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ .cpp .
    • НаТмитС Π Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ Ρ„Π°ΠΉΠ»ΠΎΠ² Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ Ρ„Π°ΠΉΠ»ΠΎΠ² Π² мСню, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ .cxx ΠΈΠ»ΠΈ .hxx . Π’ Π½ΠΎΠ²Ρ‹Ρ… Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡΡ… Ρ„Π°ΠΉΠ»ΠΎΠ² Π’ появившСмся Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠΌ ΠΎΠΊΠ½Π΅ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° ΠΈΠ· Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ источника ΠΈ Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° мСню ΠΈ Π½Π°ΠΆΠΌΠΈΡ‚Π΅ OK .
  5. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°, Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ связанный Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Ρ„Π»Π°ΠΆΠΎΠΊ.
  6. Π©Π΅Π»ΠΊΠ½ΠΈΡ‚Π΅ OK .

ПослС добавлСния Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π½ΠΎΠ²Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² C/C++ Π²Π°ΠΌ всС Ρ€Π°Π²Π½ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ CMake для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Ρ„Π°ΠΉΠ»ΠΎΠ² Π² ваша родная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°.

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ рСсурсы

Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ΅ ΠΊΠΎΠ΄Π° C/C++ Π² вашСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅. рСсурс.

Codelabs

  • Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Hello-CMake с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Android Studio Π’ этой Π»Π°Π±ΠΎΡ€Π°Ρ‚ΠΎΡ€ΠΈΠΈ ΠΊΠΎΠ΄Π° ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ шаблон Android Studio CMake для запуска Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Android NDK.

БвяТитС Gradle со своСй Ρ€ΠΎΠ΄Π½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ | Android-студия

Π§Ρ‚ΠΎΠ±Ρ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ваш собствСнный ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π² качСствС зависимости сборки Gradle, Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Gradle ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ сцСнария CMake ΠΈΠ»ΠΈ ndk-build. Когда Π²Ρ‹ создаСтС своС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Gradle запускаСт CMake ΠΈΠ»ΠΈ ndk-build, Π° ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ с вашим ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ. Gradle Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ скрипт сборки, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ Π²Ρ‚ΡΠ½ΡƒΡ‚ΡŒ Π² свой ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Android Studio, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊ Π½ΠΈΠΌ доступ ΠΈΠ· Окно ΠΏΡ€. . Если Ρƒ вас Π½Π΅Ρ‚ скрипта сборки для Ρ€ΠΎΠ΄Π½ΠΎΠ³ΠΎ исходники, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΉ сборки CMake, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π² вашСм ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ Android ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ связан Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΎΠ΄Π½ΠΈΠΌ CMake ΠΈΠ»ΠΈ ndk-build. Ρ„Π°ΠΉΠ» сцСнария. Π’Π°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΈ ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· нСсколько ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² CMake, Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ Ρ„Π°ΠΉΠ» CMakeLists.txt ΠΊΠ°ΠΊ ваш скрипт сборки CMake Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня (с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π²Ρ‹ Π·Π°Ρ‚Π΅ΠΌ связываСтС Gradle) ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ CMake ΠΊΠ°ΠΊ зависимости этого скрипта сборки. Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, Ссли Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ ndk-build, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ Makefile Π² ваш Ρ„Π°ΠΉΠ» Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня. Android.mk Ρ„Π°ΠΉΠ» скрипта.

Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹ свяТСтС Gradle с Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ, Android Studio ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ ПанСль Project для отобраТСния исходных Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ собствСнных Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ. Π² Π³Ρ€ΡƒΠΏΠΏΠ΅ cpp , Π° ваши внСшниС скрипты сборки Π² Π³Ρ€ΡƒΠΏΠΏΠ΅ Π“Ρ€ΡƒΠΏΠΏΠ° Π’Π½Π΅ΡˆΠ½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ сборки .

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅. ΠŸΡ€ΠΈ внСсСнии ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ Gradle ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅ измСнСния, Π½Π°ΠΆΠ°Π² Sync Project Π½Π° ΠΏΠ°Π½Π΅Π»ΠΈ инструмСнтов. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΡ€ΠΈ внСсСнии ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² CMake ΠΈΠ»ΠΈ ndk-build script послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²Ρ‹ ΡƒΠΆΠ΅ связали Π΅Π³ΠΎ с Gradle, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Android Studio с вашими измСнСниями, Π²Ρ‹Π±Ρ€Π°Π² Π‘Π±ΠΎΡ€ΠΊΠ° > ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ связанный C++ ΠŸΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ ΠΈΠ· строки мСню.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ Gradle с внСшним ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ CMake ΠΈΠ»ΠΈ ndk-build, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ интСрфСйс Android-студии:

  1. ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ панСль Project с Π»Π΅Π²ΠΎΠΉ стороны IDE ΠΈ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Π²ΠΈΠ΄ Android .
  2. Π©Π΅Π»ΠΊΠ½ΠΈΡ‚Π΅ ΠΏΡ€Π°Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ ΠΌΡ‹ΡˆΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ со своСй собствСнной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ app , ΠΈ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Link C++ Project с Gradle ΠΈΠ· мСню. Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ, ΠΏΠΎΡ…ΠΎΠΆΠ΅Π΅ Π½Π° Ρ‚ΠΎΡ‚, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ Π½Π° рисункС 4.
  3. Π’ Ρ€Π°ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΌΡΡ мСню Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ CMake ΠΈΠ»ΠΈ . ndk-сборка .
    1. ΠŸΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€Π΅ CMake ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΠΎΠ»Π΅ рядом с ΠŸΡƒΡ‚ΡŒ ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ для указания сцСнария CMakeLists.txt . Ρ„Π°ΠΉΠ» для вашСго внСшнСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° CMake.
    2. Если Π²Ρ‹ Π²Ρ‹Π±Π΅Ρ€Π΅Ρ‚Π΅ ndk-build , ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΠΎΠ»Π΅ рядом с Project Path для указания Ρ„Π°ΠΉΠ»Π° сцСнария Android.mk для ваш внСшний ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ndk-build. Android Studio Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя Application.mk Ρ„Π°ΠΉΠ», Ссли ΠΎΠ½ находится Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅, Ρ‡Ρ‚ΠΎ ΠΈ ваш Π€Π°ΠΉΠ» Android.mk .

    Рисунок 4. БвязываниС внСшнСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° C++ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π”ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ Android Studio.

  4. Π©Π΅Π»ΠΊΠ½ΠΈΡ‚Π΅ OK .

ΠΠ°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Gradle Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ

Π§Ρ‚ΠΎΠ±Ρ‹ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Gradle для ссылки Π½Π° Π²Π°ΡˆΡƒ ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ, Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² Π‘Π»ΠΎΠΊ externalNativeBuild Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ вашСго модуля build. gradle ΠΈ настройтС Π΅Π³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ cmake ΠΈΠ»ΠΈ Π‘Π»ΠΎΠΊ ndkBuild :

Groovy

Π°Π½Π΄Ρ€ΠΎΠΈΠ΄ {
  ...
  defaultConfig {...}
  Ρ‚ΠΈΠΏΡ‹ сборки {...}
  // Π˜Π½ΠΊΠ°ΠΏΡΡƒΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ваши внСшниС собствСнныС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ сборки.
  externalNativeBuild {
    // Π˜Π½ΠΊΠ°ΠΏΡΡƒΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ваши ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ сборки CMake.
    сдСлай {
      // ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΠ΅Ρ‚ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ ΠΊ Π²Π°ΡˆΠ΅ΠΌΡƒ скрипту сборки CMake.
      ΠΏΡƒΡ‚ΡŒ "CMakeLists.txt"
    }
  }
} 

ΠšΠΎΡ‚Π»ΠΈΠ½

Π°Π½Π΄Ρ€ΠΎΠΈΠ΄ {
  ...
  defaultConfig {...}
  Ρ‚ΠΈΠΏΡ‹ сборки {...}
  // Π˜Π½ΠΊΠ°ΠΏΡΡƒΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ваши внСшниС собствСнныС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ сборки.
  externalNativeBuild {
    // Π˜Π½ΠΊΠ°ΠΏΡΡƒΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ваши ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ сборки CMake.
    сдСлай {
      // ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΠ΅Ρ‚ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ ΠΊ Π²Π°ΡˆΠ΅ΠΌΡƒ скрипту сборки CMake.
      ΠΏΡƒΡ‚ΡŒ = Ρ„Π°ΠΉΠ» ("CMakeLists.txt")
    }
  }
} 

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ Gradle с ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ сборкой ndk ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π‘Π»ΠΎΠΊ ndkBuild вмСсто cmake block ΠΈ ΡƒΠΊΠ°ΠΆΠΈΡ‚Π΅ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ ΠΊ Π²Π°ΡˆΠ΅ΠΌΡƒ Ρ„Π°ΠΉΠ»Ρƒ Android. mk . Π“Ρ€Π΅ΠΉΠ΄Π» Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ» Application.mk , Ссли ΠΎΠ½ находится Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅, Ρ‡Ρ‚ΠΎ ΠΈ ваш Ρ„Π°ΠΉΠ» Android.mk .

Π£ΠΊΠ°ΠΆΠΈΡ‚Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈ Ρ„Π»Π°Π³ΠΈ для CMake ΠΈΠ»ΠΈ ndk-build с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ настройка Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ externalNativeBuild Π±Π»ΠΎΠΊ Π²Π½ΡƒΡ‚Ρ€ΠΈ defaultConfig Π±Π»ΠΎΠΊ вашСго уровня модуля Π€Π°ΠΉΠ» build.gradle . Аналогично Π΄Ρ€ΡƒΠ³ΠΈΠΌ свойствам Π² defaultConfig , Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ эти свойства для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ вкус ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° Π² вашСй ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ сборки.

НапримСр, Ссли ваш ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ CMake ΠΈΠ»ΠΈ ndk-build опрСдСляСт нСсколько собствСнных Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ исполняСмыС Ρ„Π°ΠΉΠ»Ρ‹, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°Ρ†Π΅Π»Π΅Π½ Π½Π° свойство для создания ΠΈ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ подмноТСства этих Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Ρ‹ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ вкуса ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΊΠΎΠ΄Π° описываСтся Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· свойств, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ:

Groovy

Π°Π½Π΄Ρ€ΠΎΠΈΠ΄ {
  ...
  defaultConfig {
    ...
    // Π­Ρ‚ΠΎΡ‚ Π±Π»ΠΎΠΊ отличаСтся ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ для связывания Gradle
    // Π² ваш скрипт CMake ΠΈΠ»ΠΈ ndk-build.
    externalNativeBuild {
      // Для ndk-build вмСсто этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π±Π»ΠΎΠΊ ndkBuild.
      сдСлай {
        // ΠŸΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π² CMake.
        Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ "-DANDROID_ARM_NEON=TRUE", "-DANDROID_TOOLCHAIN=clang"
        // УстанавливаСт Ρ„Π»Π°Π³ для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ макроконстант Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° для компилятора C.
        cFlags "-D__STDC_FORMAT_MACROS"
        // УстанавливаСт Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„Π»Π°Π³ΠΈ для компилятора C++.
        cppFlags "-fexceptions", "-frtti"
      }
    }
  }
  Ρ‚ΠΈΠΏΡ‹ сборки {...}
  вкус ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° {
    ...
    Π΄Π΅ΠΌΠΎ {
      ...
      externalNativeBuild {
        сдСлай {
          ...
          // Π£ΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊΠΈΠ΅ Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈΠ»ΠΈ исполняСмыС Ρ„Π°ΠΉΠ»Ρ‹ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΈ ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Ρ‚ΡŒ
          // для вкуса этого ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°.  Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ Gradle ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ
          // "native-lib-demo" ΠΈ "my-executible-demo" выводятся ΠΈΠ· связанного
          // CMake-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. Если Π²Ρ‹ Π½Π΅ настроитС это свойство, Gradle создаст всС
          // исполняСмыС Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ ΠΎΠ±Ρ‰ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ опрСдСляСтС Π² своСм CMake
          // (ΠΈΠ»ΠΈ ndk-build) ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. Однако ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Gradle ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ
          // ΠΎΠ±Ρ‰ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π² вашСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ.
          Π½Π°Ρ†Π΅Π»Π΅Π½ Π½Π° "native-lib-demo",
                  // Π’Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ этот исполняСмый Ρ„Π°ΠΉΠ» ΠΈ Π΅Π³ΠΎ источники Π² вашСм CMakeLists.txt
                  // с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ add_executable(). Однако созданиС исполняСмых Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠ· вашСго
                  // собствСнныС исходныС ΠΊΠΎΠ΄Ρ‹ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹, ΠΈ сборка собствСнных Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ для ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ Π² Π½ΠΈΡ…
                  // вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ удовлСтворяСт Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Ρƒ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.
                  "моя-исполняСмая-дСмо"
        }
      }
    }
    ΠΎΠΏΠ»Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ {
      ...
      externalNativeBuild {
        сдСлай {
          . ..
          Π½Π°Ρ†Π΅Π»Π΅Π½Ρ‹ Π½Π° Β«ΠΎΠΏΠ»Π°Ρ‡Π΅Π½Π½ΡƒΡŽ Π½Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒΒ»,
                  "ΠΌΠΎΠΉ-исполняСмый-ΠΎΠΏΠ»Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ"
        }
      }
    }
  }
  // Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ этот Π±Π»ΠΎΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ Gradle с вашим скриптом CMake ΠΈΠ»ΠΈ ndk-build.
  externalNativeBuild {
    ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ {...}
    // ΠΈΠ»ΠΈ ndkBuild {...}
  }
} 

ΠšΠΎΡ‚Π»ΠΈΠ½

Π°Π½Π΄Ρ€ΠΎΠΈΠ΄ {
  ...
  defaultConfig {
    ...
    // Π­Ρ‚ΠΎΡ‚ Π±Π»ΠΎΠΊ отличаСтся ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ для связывания Gradle
    // Π² ваш скрипт CMake ΠΈΠ»ΠΈ ndk-build.
    externalNativeBuild {
      // Для ndk-build вмСсто этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π±Π»ΠΎΠΊ ndkBuild.
      сдСлай {
        // ΠŸΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π² CMake.
        Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ += listOf("-DANDROID_ARM_NEON=TRUE", "-DANDROID_TOOLCHAIN=clang")
        // УстанавливаСт Ρ„Π»Π°Π³ для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ макроконстант Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° для компилятора C.
        cFlags += listOf("-D__STDC_FORMAT_MACROS")
        // УстанавливаСт Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„Π»Π°Π³ΠΈ для компилятора C++.
        cppFlags += listOf("-fexceptions", "-frtti")
      }
    }
  }
  Ρ‚ΠΈΠΏΡ‹ сборки {. ..}
  вкус ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° {
    ...
    ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ("Π΄Π΅ΠΌΠΎ") {
      ...
      externalNativeBuild {
        сдСлай {
          ...
          // Π£ΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊΠΈΠ΅ Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈΠ»ΠΈ исполняСмыС Ρ„Π°ΠΉΠ»Ρ‹ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΈ ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Ρ‚ΡŒ
          // для вкуса этого ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ Gradle ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ
          // "native-lib-demo" ΠΈ "my-executible-demo" выводятся ΠΈΠ· связанного
          // CMake-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. Если Π²Ρ‹ Π½Π΅ настроитС это свойство, Gradle создаст всС
          // исполняСмыС Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ ΠΎΠ±Ρ‰ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ опрСдСляСтС Π² своСм CMake
          // (ΠΈΠ»ΠΈ ndk-build) ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. Однако ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Gradle ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ
          // ΠΎΠ±Ρ‰ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π² вашСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ.
          target += listOf("native-lib-demo",
                  // Π’Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ этот исполняСмый Ρ„Π°ΠΉΠ» ΠΈ Π΅Π³ΠΎ источники Π² вашСм CMakeLists.txt
                  // с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ add_executable(). Однако созданиС исполняСмых Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠ· вашСго
                  // собствСнныС исходныС ΠΊΠΎΠ΄Ρ‹ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹, ΠΈ сборка собствСнных Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ для ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ Π² Π½ΠΈΡ…
                  // вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ удовлСтворяСт Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Ρƒ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. 
                  "моя-исполняСмая-дСмо")
        }
      }
    }
    ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ("ΠΏΠ»Π°Ρ‚Π½ΠΎ") {
      ...
      externalNativeBuild {
        сдСлай {
          ...
          target += listOf("native-lib-paid",
                  "ΠΌΠΎΠΉ-исполняСмый-ΠΏΠ»Π°Ρ‚Π½Ρ‹ΠΉ")
        }
      }
    }
  }
  // Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ этот Π±Π»ΠΎΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ Gradle с вашим скриптом CMake ΠΈΠ»ΠΈ ndk-build.
  externalNativeBuild {
    ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ {...}
    // ΠΈΠ»ΠΈ ndkBuild {...}
  }
} 

Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС ΠΎ настройкС вкусов ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° ΠΈ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² сборки, ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π½Π° ΠΠ°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ сборки. Для список ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ для CMake с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ arguments свойство, см. ИспользованиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… CMake.

Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ созданныС собствСнныС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Gradle ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°Π» ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ созданныС собствСнныС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π½ΠΈ Π² внСшняя нативная сборка, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΈΡ… Π² src/main/jniLibs/ ABI ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ вашСго модуля.

Π’Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ вСрсии ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΠΎΠ³ΠΎ модуля Android Gradle Π΄ΠΎ 4.0, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ CMake Π˜ΠœΠŸΠžΠ Π’Π˜Π ΠžΠ’ΠΠΠž Ρ†Π΅Π»ΠΈ Π² вашСм ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ jniLibs , Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π² ваш ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Если Π²Ρ‹ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ с Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π½Π½Π΅ΠΉ вСрсии ΠΏΠ»Π°Π³ΠΈΠ½Π°, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ с ошибкой, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ:

 * Π§Ρ‚ΠΎ пошло Π½Π΅ Ρ‚Π°ΠΊ:
НС ΡƒΠ΄Π°Π»ΠΎΡΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡Ρƒ ':app:mergeDebugNativeLibs'.
> ΠŸΡ€ΠΎΠΈΠ·ΠΎΡˆΠ΅Π» сбой ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ com.android.build.gradle.internal.tasks.Workers$ActionFacade
   > Π‘Ρ‹Π»ΠΎ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° с нСзависимым ΠΎΡ‚ ОБ ΠΏΡƒΡ‚Π΅ΠΌ Β«lib/x86/libprebuilt.soΒ».
 

Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Android Gradle Plugin 4.0, пСрСмСститС всС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π˜ΠœΠŸΠžΠ Π’Π˜Π ΠžΠ’ΠΠΠž Π¦Π΅Π»ΠΈ CMake ΠΈΠ· ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° jniLibs , Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ этой ошибки.

Π£ΠΊΠ°ΠΆΠΈΡ‚Π΅ ABI

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Gradle собираСт Π²Π°ΡˆΡƒ Π½Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ . so . Ρ„Π°ΠΉΠ»Ρ‹ для Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… интСрфСйсов ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ (ABI) NDK ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΈ ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ ΠΈΡ… всС Π² вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Если Ρ‚Ρ‹ Ρ…ΠΎΡ‡Π΅ΡˆΡŒ Gradle для сборки ΠΈ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ ABI вашСго Ρ€ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΈΡ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ndk.abiΠ€ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ Ρ„Π»Π°Π³ Π² Ρ„Π°ΠΉΠ»Π΅ build.gradle уровня модуля , ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅:

Groovy

Π°Π½Π΄Ρ€ΠΎΠΈΠ΄ {
  ...
  defaultConfig {
    ...
    externalNativeBuild {
      ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ {...}
      // ΠΈΠ»ΠΈ ndkBuild {...}
    }
    // Подобно Π΄Ρ€ΡƒΠ³ΠΈΠΌ свойствам Π² Π±Π»ΠΎΠΊΠ΅  defaultConfig ,
    // Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊ ndk для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ вкуса ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°
    // Π² вашСй ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ сборки.
    Π½Π΄ΠΊ {
      // Π£ΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ABI вашСго Ρ€ΠΎΠ΄Π½ΠΎΠ³ΠΎ
      // Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Gradle Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΈ ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Ρ‚ΡŒ вмСстС с вашим ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ.
      abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a',
                   'arm64-v8a'
    }
  }
  Ρ‚ΠΈΠΏΡ‹ сборки {. ..}
  externalNativeBuild {...}
} 

ΠšΠΎΡ‚Π»ΠΈΠ½

Π°Π½Π΄Ρ€ΠΎΠΈΠ΄ {
  ...
  defaultConfig {
    ...
    externalNativeBuild {
      ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ {...}
      // ΠΈΠ»ΠΈ ndkBuild {...}
    }
    // Подобно Π΄Ρ€ΡƒΠ³ΠΈΠΌ свойствам Π² Π±Π»ΠΎΠΊΠ΅  defaultConfig ,
    // Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊ ndk для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ вкуса ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°
    // Π² вашСй ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ сборки.
    Π½Π΄ΠΊ {
      // Π£ΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ABI вашСго Ρ€ΠΎΠ΄Π½ΠΎΠ³ΠΎ
      // Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Gradle Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΈ ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Ρ‚ΡŒ вмСстС с вашим ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ.
      abiFilters += listOf("x86", "x86_64", "armeabi", "armeabi-v7a",
                   "arm64-v8a")
    }
  }
  Ρ‚ΠΈΠΏΡ‹ сборки {...}
  externalNativeBuild {...}
} 

Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв достаточно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ abiFilters Π² ndk Π±Π»ΠΎΠΊ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π²Ρ‹ΡˆΠ΅, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ сообщаСт Gradle ΠΎ нСобходимости сборки ΠΈ ΡƒΠΏΠ°ΠΊΡƒΠΉΡ‚Π΅ эти вСрсии Π²Π°ΡˆΠΈΡ… собствСнных Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ. Однако, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Gradle, нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚ Π² своС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, настройтС Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Ρ„Π»Π°Π³ abiFilters Π² defaultConfig.externalNativeBuild.cmake Π±Π»ΠΎΠΊ (ΠΈΠ»ΠΈ defaultConfig.externalNativeBuild.ndkBuild 9Π±Π»ΠΎΠΊ 0004). Π“Ρ€Π΅ΠΉΠ΄Π» создаСт эти ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ABI, Π½ΠΎ ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ ΡƒΠΊΠ°Π·Π°Π»ΠΈ Π² Π±Π»ΠΎΠΊ defaultConfig.ndk .

РСкомСндуСтся ΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Android App Bundle, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Ρ‰Π΅ большС ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ вашСго прилоТСния, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ собствСнныС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ABI ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ устройство Π±ΡƒΠ΄Π΅Ρ‚ доставлСно вмСстС с Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ.

Для ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΡ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ с использованиСм APK (созданных Π΄ΠΎ августа 2021 Π³.) рассмотритС настройка нСсколько APK Π½Π° основС ABI β€” вмСсто создания ΠΎΠ΄Π½ΠΎΠ³ΠΎ большого APK со всСми вСрсии Π²Π°ΡˆΠΈΡ… Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, Gradle создаСт ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ APK для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ABI Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ, ΠΈ ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ Ρ„Π°ΠΉΠ»Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½Ρ‹ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ABI.