{"id":2502,"date":"2020-01-12T11:47:43","date_gmt":"2020-01-12T08:47:43","guid":{"rendered":"http:\/\/demensdeum.com\/blog\/?p=2502"},"modified":"2024-12-16T22:32:30","modified_gmt":"2024-12-16T19:32:30","slug":"porting-cpp-sdl-app-on-android","status":"publish","type":"post","link":"https:\/\/demensdeum.com\/blog\/ru\/2020\/01\/12\/porting-cpp-sdl-app-on-android\/","title":{"rendered":"\u041f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c C++ SDL \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 Android"},"content":{"rendered":"<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0437\u0430\u043c\u0435\u0442\u043a\u0435 \u044f \u043e\u043f\u0438\u0448\u0443 \u0441\u0432\u043e\u0439 \u043e\u043f\u044b\u0442 \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430 3D \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 <a href=\"https:\/\/gitlab.com\/demensdeum\/cube-art-project-bootstrap\" target=\"_blank\" rel=\"noopener noreferrer\">Cube Art Project<\/a> \u043d\u0430 Android.<br \/>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u0432 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0435 \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0441 3D \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c \u043a\u0443\u0431\u0430 \u043a\u0440\u0430\u0441\u043d\u043e\u0433\u043e \u0446\u0432\u0435\u0442\u0430:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-2509\" src=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2020\/01\/emulator.png\" alt=\"\" width=\"460\" height=\"265\" srcset=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2020\/01\/emulator.png 959w, https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2020\/01\/emulator-300x173.png 300w, https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2020\/01\/emulator-768x442.png 768w\" sizes=\"auto, (max-width: 460px) 100vw, 460px\" \/><\/p>\n<p>\u0414\u043b\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0438 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<ol>\n<li>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 Android SDK \u0438 NDK (\u0432\u0435\u0440\u0441\u0438\u044e \u043d\u0434\u043a \u0447\u0435\u043c \u0441\u0432\u0435\u0436\u0435\u0435 \u0442\u0435\u043c \u043b\u0443\u0447\u0448\u0435).<\/li>\n<li>\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 SDL2, \u0432\u0437\u044f\u0442\u044c \u043e\u0442\u0442\u0443\u0434\u0430 \u0448\u0430\u0431\u043b\u043e\u043d \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0430\u043d\u0434\u0440\u043e\u0438\u0434 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/li>\n<li>\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c SDL Image, SDL Mixer \u043a \u0441\u0431\u043e\u0440\u043a\u0435.<\/li>\n<li>\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043c\u043e\u0435\u0433\u043e \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430 \u0438 \u0442\u0443\u043b\u043a\u0438\u0442\u0430, \u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 (GLM, JSON for Modern C++)<\/li>\n<li>\u0410\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u0441\u0431\u043e\u0440\u043e\u043a \u0434\u043b\u044f Gradle.<\/li>\n<li>\u0410\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c C++ \u043a\u043e\u0434 \u0434\u043b\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0441 Android, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0441\u043d\u0443\u043b\u0438\u0441\u044c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 (OpenGL ES, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430)<\/li>\n<li>\u0421\u043e\u0431\u0440\u0430\u0442\u044c \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0435.<\/li>\n<\/ol>\n<h3>\u0428\u0430\u0431\u043b\u043e\u043d \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/h3>\n<p>\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 SDL, SDL Image, SDL Mixer:<br \/><a href=\"https:\/\/www.libsdl.org\/download-2.0.php\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/www.libsdl.org\/download-2.0.php<\/a><br \/>\n\u0412 \u043f\u0430\u043f\u043a\u0435 docs \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0430\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043f\u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u043c \u0430\u043d\u0434\u0440\u043e\u0438\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u0430; \u0441\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e android-project \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u043f\u0430\u043f\u043a\u0443, \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0441\u0438\u043c\u043b\u0438\u043d\u043a \u0438\u043b\u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u043f\u0430\u043f\u043a\u0443 SDL \u0432 android-project\/app\/jni.<br \/>\u041f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u0444\u043b\u0430\u0433\u0430 avd, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440 \u0430\u043d\u0434\u0440\u043e\u0438\u0434\u0430 \u0438\u0437 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 Sdk:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>cd ~\/Android\/Sdk\/emulator\n.\/emulator -avd Pixel_2_API_24\n\n<\/code><\/pre>\n<\/div>\n<p>\u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u0443\u0442\u0438 \u0432 \u0441\u043a\u0440\u0438\u043f\u0442\u0435, \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>rm -rf app\/build || true\nexport ANDROID_HOME=\/home\/demensdeum\/Android\/Sdk\/\nexport ANDROID_NDK_HOME=\/home\/demensdeum\/Android\/android-ndk-r21-beta2\/\n.\/gradlew clean build\n.\/gradlew installDebug\n\n<\/code><\/pre>\n<\/div>\n<p>\u0414\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0448\u0430\u0431\u043b\u043e\u043d \u043f\u0440\u043e\u0435\u043a\u0442\u0430 SDL \u0441 \u043a\u043e\u0434\u043e\u043c \u043d\u0430 \u0421\u0438 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>android-sdl-test-app\/cube-art-project-android\/app\/jni\/src\/YourSourceHere.c\n\n<\/code><\/pre>\n<\/div>\n<h3>\u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438<\/h3>\n<p>\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432 \u0430\u0440\u0445\u0438\u0432\u0430\u0445 \u0434\u043b\u044f SDL_image, SDL_mixer:<br \/><a href=\"https:\/\/www.libsdl.org\/projects\/SDL_image\/\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/www.libsdl.org\/projects\/SDL_image\/<\/a><br \/>\n<a href=\"https:\/\/www.libsdl.org\/projects\/SDL_mixer\/\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/www.libsdl.org\/projects\/SDL_mixer\/<\/a><\/p>\n<p>\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043c\u043e\u0438 shared \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438:<br \/><a href=\"https:\/\/gitlab.com\/demensdeum\/FlameSteelCore\/\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/gitlab.com\/demensdeum\/FlameSteelCore\/<\/a><br \/>\n<a href=\"https:\/\/gitlab.com\/demensdeum\/FlameSteelCommonTraits\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/gitlab.com\/demensdeum\/FlameSteelCommonTraits<\/a><br \/>\n<a href=\"https:\/\/gitlab.com\/demensdeum\/FlameSteelBattleHorn\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/gitlab.com\/demensdeum\/FlameSteelBattleHorn<\/a><br \/>\n<a href=\"https:\/\/gitlab.com\/demensdeum\/FlameSteelEngineGameToolkit\/\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/gitlab.com\/demensdeum\/FlameSteelEngineGameToolkit\/<\/a><br \/>\n<a href=\"https:\/\/gitlab.com\/demensdeum\/FlameSteelEngineGameToolkitFSGL\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/gitlab.com\/demensdeum\/FlameSteelEngineGameToolkitFSGL<\/a><br \/>\n<a href=\"https:\/\/gitlab.com\/demensdeum\/FSGL\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/gitlab.com\/demensdeum\/FSGL<\/a><br \/>\n<a href=\"https:\/\/gitlab.com\/demensdeum\/cube-art-project\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/gitlab.com\/demensdeum\/cube-art-project<\/a><\/p>\n<p>\u0412\u0441\u0435 \u044d\u0442\u043e \u0432\u044b\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0432 app\/jni, \u043a\u0430\u0436\u0434\u044b\u0439 \u201c\u043c\u043e\u0434\u0443\u043b\u044c\u201d \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u043f\u0430\u043f\u043a\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 app\/jni\/FSGL. \u0414\u0430\u043b\u0435\u0435 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043d\u0430\u0439\u0442\u0438 \u0440\u0430\u0431\u043e\u0447\u0438\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u043e\u0432 Application.mk \u0438 Android.mk, \u044f \u043d\u0435 \u043d\u0430\u0448\u0435\u043b, \u043e\u0434\u043d\u0430\u043a\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 CMake. \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0430\u043c \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u043c \u0444\u0430\u0439\u043b\u043e\u0432 \u0441\u0431\u043e\u0440\u043a\u0438 \u0434\u043b\u044f Android NDK:<br \/><a href=\"https:\/\/developer.android.com\/ndk\/guides\/application_mk\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/developer.android.com\/ndk\/guides\/application_mk<\/a><br \/>\n<a href=\"https:\/\/developer.android.com\/ndk\/guides\/android_mk\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/developer.android.com\/ndk\/guides\/android_mk<\/a><\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u0440\u043e \u0440\u0430\u0437\u043d\u044b\u0435 APP_STL \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 NDK:<br \/><a href=\"https:\/\/developer.android.com\/ndk\/guides\/cpp-support.html\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/developer.android.com\/ndk\/guides\/cpp-support.html<\/a><\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u201c\u043c\u043e\u0434\u0443\u043b\u044f\u201d \u0444\u0430\u0439\u043b Android.mk, \u0434\u0430\u043b\u0435\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 \u0444\u0430\u0439\u043b \u0441\u0431\u043e\u0440\u043a\u0438 shared \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Cube-Art-Project:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>LOCAL_PATH := $(call my-dir)\ninclude $(CLEAR_VARS)\n\nAPP_STL := c++_static\nAPP_CPPFLAGS := -fexceptions\nLOCAL_MODULE := CubeArtProject\nLOCAL_C_INCLUDES := $(LOCAL_PATH)\/src $(LOCAL_PATH)\/..\/include $(LOCAL_PATH)\/..\/include\/FlameSteelCommonTraits\/src\/FlameSteelCommonTraits\nLOCAL_EXPORT_C_INCLUDES = $(LOCAL_PATH)\/src\/\n\ndefine walk\n$(wildcard $(1)) $(foreach e, $(wildcard $(1)\/*), $(call walk, $(e)))\nendef\n\nALLFILES = $(call walk, $(LOCAL_PATH)\/src)\nFILE_LIST := $(filter %.cpp, $(ALLFILES))\n$(info CubeArtProject source code files list)\n$(info $(FILE_LIST))\nLOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)\/%=%)\n\nLOCAL_SHARED_LIBRARIES += FlameSteelCore\nLOCAL_SHARED_LIBRARIES += FlameSteelBattleHorn\nLOCAL_SHARED_LIBRARIES += FlameSteelCommonTraits\nLOCAL_SHARED_LIBRARIES += FlameSteelEngineGameToolkit\nLOCAL_SHARED_LIBRARIES += FlameSteelEngineGameToolkitFSGL\nLOCAL_SHARED_LIBRARIES += FSGL\nLOCAL_SHARED_LIBRARIES += SDL2\nLOCAL_SHARED_LIBRARIES += SDL2_image\n\nLOCAL_LDFLAGS := -static-libstdc++\ninclude $(BUILD_SHARED_LIBRARY)\n\n<\/code><\/pre>\n<\/div>\n<p>\u041b\u044e\u0431\u043e\u0439 \u043e\u043f\u044b\u0442\u043d\u044b\u0439 CMake \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u043e\u0439\u043c\u0435\u0442 \u044d\u0442\u043e\u0442 \u043a\u043e\u043d\u0444\u0438\u0433 \u0441 \u043f\u0435\u0440\u0432\u044b\u0445 \u0441\u0442\u0440\u043e\u043a, \u0444\u043e\u0440\u043c\u0430\u0442\u044b \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0438, \u0432 Android.mk \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 GLOB_RECURSIVE, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0438\u0441\u043a\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 walk.<\/p>\n<p>\u041c\u0435\u043d\u044f\u0435\u043c Application.mk, Android.mk \u0441\u043e-\u043d\u043e \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 C++ \u0430 \u043d\u0435 \u0421\u0438 \u043a\u043e\u0434\u0430:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>APP_ABI := armeabi-v7a arm64-v8a x86 x86_64\nAPP_PLATFORM=android-16\nAPP_STL := c++_static\nAPP_CPPFLAGS := -fexceptions\n\n<\/code><\/pre>\n<\/div>\n<p>\u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u0435\u043c YourSourceHere.c -> YourSourceHere.cpp, grep\u2019\u0430\u0435\u043c \u043f\u043e \u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f\u043c, \u043c\u0435\u043d\u044f\u0435\u043c \u043f\u0443\u0442\u044c \u0432 \u0441\u0431\u043e\u0440\u043a\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>app\/jni\/src\/Android.mk:LOCAL_SRC_FILES := YourSourceHere.cpp\n\n<\/code><\/pre>\n<\/div>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442, \u0435\u0441\u043b\u0438 \u0432\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u043e\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u043e\u0431 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438 \u0445\u0438\u0434\u0435\u0440\u043e\u0432, \u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0435\u0439 \u0432 Android.mk; \u0435\u0441\u043b\u0438 \u043e\u0448\u0438\u0431\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442 \u043b\u0438\u043d\u043a\u043e\u0432\u0449\u0438\u043a\u0430 \u0432\u0438\u0434\u0430 \u201cundefined reference\u201d, \u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0432 \u0441\u0431\u043e\u0440\u043a\u0430\u0445, \u043e\u0442\u0442\u0440\u0435\u0439\u0441\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435 $(info $(FILE_LIST)) \u0432 Android.mk \u0444\u0430\u0439\u043b\u0435. \u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u043e \u0434\u0432\u043e\u0439\u043d\u043e\u043c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0435 \u043b\u0438\u043d\u043a\u043e\u0432\u043a\u0438, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0432 \u043a\u043b\u044e\u0447\u0435 LOCAL_SHARED_LIBRARIES \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u043b\u0438\u043d\u043a\u043e\u0432\u043a\u0435 \u0447\u0435\u0440\u0435\u0437 LD, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f FSGL:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>LOCAL_LDLIBS := -lEGL -lGLESv2\n\n<\/code><\/pre>\n<\/div>\n<h3>\u0410\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u044f \u0438 \u0437\u0430\u043f\u0443\u0441\u043a<\/h3>\n<p>\u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0435\u0449\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0443\u0431\u0440\u0430\u0442\u044c GLEW \u0438\u0437 \u0441\u0431\u043e\u0440\u043e\u043a \u0434\u043b\u044f iOS \u0438 Android, \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c \u0447\u0430\u0441\u0442\u044c \u0432\u044b\u0437\u043e\u0432\u043e\u0432 OpenGL, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u043f\u043e\u0441\u0442\u0444\u0438\u043a\u0441 EOS (glGenVertexArrays -> glGenVertexArraysOES), \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043c\u0430\u043a\u0440\u043e\u0441 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043c\u043e\u0434\u0435\u0440\u043d\u043e\u0432\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u0435\u0431\u0430\u0433\u0430, \u0432\u0438\u0448\u0435\u043d\u043a\u0430 \u043d\u0430 \u0442\u043e\u0440\u0442\u0435 \u044d\u0442\u043e \u043d\u0435\u044f\u0432\u043d\u044b\u0439 \u0438\u043d\u043a\u043b\u0443\u0434 GLES2 \u0445\u0438\u0434\u0435\u0440\u043e\u0432 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u043c\u0430\u043a\u0440\u043e\u0441\u0430 GL_GLEXT_PROTOTYPES 1:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>#define GL_GLEXT_PROTOTYPES 1\n#include \"SDL_opengles2.h\"\n\n<\/code><\/pre>\n<\/div>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u043b \u0447\u0435\u0440\u043d\u044b\u0439 \u044d\u043a\u0440\u0430\u043d \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0445 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0445 \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439 \u0432\u0438\u0434\u0430 \u201cE\/libEGL: validate_display:255 error 3008 (EGL_BAD_DISPLAY)\u201d, \u043f\u043e\u043c\u0435\u043d\u044f\u043b \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043e\u043a\u043d\u0430 SDL, \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0430 OpenGL \u0438 \u0432\u0441\u0435 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>SDL_DisplayMode mode;\nSDL_GetDisplayMode(0,0,&mode);\nint width = mode.w;\nint height = mode.h;\n\nwindow = SDL_CreateWindow(\n            title,\n            0,\n            0,\n            width,\n            height,\n            SDL_WINDOW_OPENGL | SDL_WINDOW_FULLSCREEN | SDL_WINDOW_RESIZABLE\n        );\n\nSDL_GL_SetAttribute( SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES );\n<\/code><\/pre>\n<\/div>\n<p>\u041d\u0430 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u0438\u043a\u043e\u043d\u043a\u043e\u0439 SDL \u0438 \u0438\u043c\u0435\u043d\u0435\u043c &#8220;Game&#8221;.<\/p>\n<p>\u041c\u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0444\u0430\u0439\u043b\u043e\u0432 \u0441\u0431\u043e\u0440\u043a\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 CMake, \u043b\u0438\u0431\u043e \u0436\u0435 \u043c\u0438\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0438 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c \u043d\u0430 Gradle; \u043e\u0434\u043d\u0430\u043a\u043e CMake \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0432\u044b\u0431\u043e\u0440\u043e\u043c \u0434\u0435\u0444\u0430\u043a\u0442\u043e \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0430 C++.<\/p>\n<h3>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434<\/h3>\n<p><a href=\"https:\/\/gitlab.com\/demensdeum\/android-sdl-test-app\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/gitlab.com\/demensdeum\/android-sdl-test-app<\/a><br \/><a href=\"https:\/\/gitlab.com\/demensdeum\/android-sdl-test-app\/tree\/master\/cube-art-project-android\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/gitlab.com\/demensdeum\/android-sdl-test-app\/tree\/master\/cube-art-project-android<\/a><\/p>\n<h3>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438<\/h3>\n<p><a href=\"https:\/\/developer.android.com\/ndk\/guides\/cpp-support.html\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/developer.android.com\/ndk\/guides\/cpp-support.html<\/a><br \/><a href=\"https:\/\/developer.android.com\/ndk\/guides\/application_mk\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/developer.android.com\/ndk\/guides\/application_mk<\/a><br \/>\n<a href=\"https:\/\/developer.android.com\/ndk\/guides\/android_mk\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/developer.android.com\/ndk\/guides\/android_mk<\/a><br \/>\n<a href=\"https:\/\/lazyfoo.net\/tutorials\/SDL\/52_hello_mobile\/android_windows\/index.php\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/lazyfoo.net\/tutorials\/SDL\/52_hello_mobile\/android_windows\/index.php<\/a><br \/>\n<a href=\"https:\/\/medium.com\/androiddevelopers\/getting-started-with-c-and-android-native-activities-2213b402ffff\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/medium.com\/androiddevelopers\/getting-started-with-c-and-android-native-activities-2213b402ffff<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0437\u0430\u043c\u0435\u0442\u043a\u0435 \u044f \u043e\u043f\u0438\u0448\u0443 \u0441\u0432\u043e\u0439 \u043e\u043f\u044b\u0442 \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430 3D \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 Cube Art Project \u043d\u0430 Android.\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u0432 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0435 \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0441 3D \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c \u043a\u0443\u0431\u0430 \u043a\u0440\u0430\u0441\u043d\u043e\u0433\u043e \u0446\u0432\u0435\u0442\u0430: \u0414\u043b\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0438 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435: \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 Android SDK \u0438 NDK (\u0432\u0435\u0440\u0441\u0438\u044e \u043d\u0434\u043a \u0447\u0435\u043c \u0441\u0432\u0435\u0436\u0435\u0435 \u0442\u0435\u043c \u043b\u0443\u0447\u0448\u0435). \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 SDL2, \u0432\u0437\u044f\u0442\u044c \u043e\u0442\u0442\u0443\u0434\u0430 \u0448\u0430\u0431\u043b\u043e\u043d<a class=\"more-link\" href=\"https:\/\/demensdeum.com\/blog\/ru\/2020\/01\/12\/porting-cpp-sdl-app-on-android\/\">Continue reading <span class=\"screen-reader-text\">&#8220;\u041f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c C++ SDL \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 Android&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[61,52],"tags":[37,124,145,146,77,147,148],"class_list":["post-2502","post","type-post","status-publish","format-standard","hentry","category-techie","category-tutorials","tag-android","tag-c","tag-cpp","tag-opengl-es","tag-sdl","tag-sdl-image","tag-sdl-mixer","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"ru","enabled_languages":["en","ru","zh","de","fr","ja","pt","hi"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"ru":{"title":true,"content":true,"excerpt":false},"zh":{"title":true,"content":true,"excerpt":false},"de":{"title":true,"content":true,"excerpt":false},"fr":{"title":true,"content":true,"excerpt":false},"ja":{"title":true,"content":true,"excerpt":false},"pt":{"title":true,"content":true,"excerpt":false},"hi":{"title":false,"content":false,"excerpt":false}}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/demensdeum.com\/blog\/ru\/wp-json\/wp\/v2\/posts\/2502","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demensdeum.com\/blog\/ru\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demensdeum.com\/blog\/ru\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/ru\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/ru\/wp-json\/wp\/v2\/comments?post=2502"}],"version-history":[{"count":31,"href":"https:\/\/demensdeum.com\/blog\/ru\/wp-json\/wp\/v2\/posts\/2502\/revisions"}],"predecessor-version":[{"id":3923,"href":"https:\/\/demensdeum.com\/blog\/ru\/wp-json\/wp\/v2\/posts\/2502\/revisions\/3923"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/ru\/wp-json\/wp\/v2\/media?parent=2502"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/ru\/wp-json\/wp\/v2\/categories?post=2502"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/ru\/wp-json\/wp\/v2\/tags?post=2502"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}