diff --git a/projects/VS2019-Android/raylib_android/ARM64/Debug/libmain.so b/projects/VS2019-Android/raylib_android/ARM64/Debug/libmain.so
new file mode 100644
index 000000000..9281b60b7
Binary files /dev/null and b/projects/VS2019-Android/raylib_android/ARM64/Debug/libmain.so differ
diff --git a/projects/VS2019-Android/raylib_android/ARM64/Debug/libmain.so.recipe b/projects/VS2019-Android/raylib_android/ARM64/Debug/libmain.so.recipe
new file mode 100644
index 000000000..17bfe6c83
--- /dev/null
+++ b/projects/VS2019-Android/raylib_android/ARM64/Debug/libmain.so.recipe
@@ -0,0 +1,11 @@
+
+
+ C:\raylib-master\projects\VS2019-Android\raylib_android\ARM64\Debug\libmain.so;C:\Users\VadimPC\AppData\Local\Android\Sdk\ndk\21.1.6352462\prebuilt\android-arm64\gdbserver\gdbserver;C:\Users\VadimPC\AppData\Local\Android\Sdk\ndk\21.1.6352462\sources\cxx-stl\llvm-libc++\libs\arm64-v8a\libc++_static.a;C:\Users\VadimPC\AppData\Local\Android\Sdk\ndk\21.1.6352462\sources\cxx-stl\llvm-libc++\libs\arm64-v8a\libc++abi.a
+
+ C:\raylib-master\projects\VS2019-Android\raylib_android\raylib_android\raylib_android.NativeActivity\ARM64\Debug
+ Debug
+ ARM64
+ arm64-v8a
+
+
+
\ No newline at end of file
diff --git a/projects/VS2019-Android/raylib_android/raylib_android.sln b/projects/VS2019-Android/raylib_android/raylib_android.sln
new file mode 100644
index 000000000..ec1880c0e
--- /dev/null
+++ b/projects/VS2019-Android/raylib_android/raylib_android.sln
@@ -0,0 +1,75 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.31702.278
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "raylib_android", "raylib_android", "{5C24BC76-8848-40EA-9BBB-A544648D8D5B}"
+EndProject
+Project("{39E2626F-3545-4960-A6E8-258AD8476CE5}") = "raylib_android.Packaging", "raylib_android\raylib_android.Packaging\raylib_android.Packaging.androidproj", "{B2231F0D-52DA-4C55-8998-5886F766553C}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "raylib_android.NativeActivity", "raylib_android\raylib_android.NativeActivity\raylib_android.NativeActivity.vcxproj", "{BFB31759-4FCA-4503-BC7C-A97F705EFDB2}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|ARM = Debug|ARM
+ Debug|ARM64 = Debug|ARM64
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
+ Release|ARM = Release|ARM
+ Release|ARM64 = Release|ARM64
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {B2231F0D-52DA-4C55-8998-5886F766553C}.Debug|ARM.ActiveCfg = Debug|ARM
+ {B2231F0D-52DA-4C55-8998-5886F766553C}.Debug|ARM.Build.0 = Debug|ARM
+ {B2231F0D-52DA-4C55-8998-5886F766553C}.Debug|ARM.Deploy.0 = Debug|ARM
+ {B2231F0D-52DA-4C55-8998-5886F766553C}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {B2231F0D-52DA-4C55-8998-5886F766553C}.Debug|ARM64.Build.0 = Debug|ARM64
+ {B2231F0D-52DA-4C55-8998-5886F766553C}.Debug|ARM64.Deploy.0 = Debug|ARM64
+ {B2231F0D-52DA-4C55-8998-5886F766553C}.Debug|x64.ActiveCfg = Debug|x64
+ {B2231F0D-52DA-4C55-8998-5886F766553C}.Debug|x64.Build.0 = Debug|x64
+ {B2231F0D-52DA-4C55-8998-5886F766553C}.Debug|x64.Deploy.0 = Debug|x64
+ {B2231F0D-52DA-4C55-8998-5886F766553C}.Debug|x86.ActiveCfg = Debug|x86
+ {B2231F0D-52DA-4C55-8998-5886F766553C}.Debug|x86.Build.0 = Debug|x86
+ {B2231F0D-52DA-4C55-8998-5886F766553C}.Debug|x86.Deploy.0 = Debug|x86
+ {B2231F0D-52DA-4C55-8998-5886F766553C}.Release|ARM.ActiveCfg = Release|ARM
+ {B2231F0D-52DA-4C55-8998-5886F766553C}.Release|ARM.Build.0 = Release|ARM
+ {B2231F0D-52DA-4C55-8998-5886F766553C}.Release|ARM.Deploy.0 = Release|ARM
+ {B2231F0D-52DA-4C55-8998-5886F766553C}.Release|ARM64.ActiveCfg = Release|ARM64
+ {B2231F0D-52DA-4C55-8998-5886F766553C}.Release|ARM64.Build.0 = Release|ARM64
+ {B2231F0D-52DA-4C55-8998-5886F766553C}.Release|ARM64.Deploy.0 = Release|ARM64
+ {B2231F0D-52DA-4C55-8998-5886F766553C}.Release|x64.ActiveCfg = Release|x64
+ {B2231F0D-52DA-4C55-8998-5886F766553C}.Release|x64.Build.0 = Release|x64
+ {B2231F0D-52DA-4C55-8998-5886F766553C}.Release|x64.Deploy.0 = Release|x64
+ {B2231F0D-52DA-4C55-8998-5886F766553C}.Release|x86.ActiveCfg = Release|x86
+ {B2231F0D-52DA-4C55-8998-5886F766553C}.Release|x86.Build.0 = Release|x86
+ {B2231F0D-52DA-4C55-8998-5886F766553C}.Release|x86.Deploy.0 = Release|x86
+ {BFB31759-4FCA-4503-BC7C-A97F705EFDB2}.Debug|ARM.ActiveCfg = Debug|ARM
+ {BFB31759-4FCA-4503-BC7C-A97F705EFDB2}.Debug|ARM.Build.0 = Debug|ARM
+ {BFB31759-4FCA-4503-BC7C-A97F705EFDB2}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {BFB31759-4FCA-4503-BC7C-A97F705EFDB2}.Debug|ARM64.Build.0 = Debug|ARM64
+ {BFB31759-4FCA-4503-BC7C-A97F705EFDB2}.Debug|x64.ActiveCfg = Debug|x64
+ {BFB31759-4FCA-4503-BC7C-A97F705EFDB2}.Debug|x64.Build.0 = Debug|x64
+ {BFB31759-4FCA-4503-BC7C-A97F705EFDB2}.Debug|x86.ActiveCfg = Debug|x86
+ {BFB31759-4FCA-4503-BC7C-A97F705EFDB2}.Debug|x86.Build.0 = Debug|x86
+ {BFB31759-4FCA-4503-BC7C-A97F705EFDB2}.Release|ARM.ActiveCfg = Release|ARM
+ {BFB31759-4FCA-4503-BC7C-A97F705EFDB2}.Release|ARM.Build.0 = Release|ARM
+ {BFB31759-4FCA-4503-BC7C-A97F705EFDB2}.Release|ARM64.ActiveCfg = Release|ARM64
+ {BFB31759-4FCA-4503-BC7C-A97F705EFDB2}.Release|ARM64.Build.0 = Release|ARM64
+ {BFB31759-4FCA-4503-BC7C-A97F705EFDB2}.Release|x64.ActiveCfg = Release|x64
+ {BFB31759-4FCA-4503-BC7C-A97F705EFDB2}.Release|x64.Build.0 = Release|x64
+ {BFB31759-4FCA-4503-BC7C-A97F705EFDB2}.Release|x86.ActiveCfg = Release|x86
+ {BFB31759-4FCA-4503-BC7C-A97F705EFDB2}.Release|x86.Build.0 = Release|x86
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {B2231F0D-52DA-4C55-8998-5886F766553C} = {5C24BC76-8848-40EA-9BBB-A544648D8D5B}
+ {BFB31759-4FCA-4503-BC7C-A97F705EFDB2} = {5C24BC76-8848-40EA-9BBB-A544648D8D5B}
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {B7ED0AA6-6B00-40AC-BF71-526D5BEEFC78}
+ EndGlobalSection
+EndGlobal
diff --git a/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/ARM64/Debug/android_native_app_glue.o b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/ARM64/Debug/android_native_app_glue.o
new file mode 100644
index 000000000..397969dea
Binary files /dev/null and b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/ARM64/Debug/android_native_app_glue.o differ
diff --git a/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/ARM64/Debug/libmain.so b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/ARM64/Debug/libmain.so
new file mode 100644
index 000000000..dea942af3
Binary files /dev/null and b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/ARM64/Debug/libmain.so differ
diff --git a/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/ARM64/Debug/main.o b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/ARM64/Debug/main.o
new file mode 100644
index 000000000..53e4bacd3
Binary files /dev/null and b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/ARM64/Debug/main.o differ
diff --git a/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/ARM64/Debug/raylib_a.bfb31759.tlog/Microsoft.Build.CPPTasks.ClangCompile.read.1.tlog b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/ARM64/Debug/raylib_a.bfb31759.tlog/Microsoft.Build.CPPTasks.ClangCompile.read.1.tlog
new file mode 100644
index 000000000..381ca66a2
Binary files /dev/null and b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/ARM64/Debug/raylib_a.bfb31759.tlog/Microsoft.Build.CPPTasks.ClangCompile.read.1.tlog differ
diff --git a/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/ARM64/Debug/raylib_a.bfb31759.tlog/Microsoft.Build.CPPTasks.ClangCompile.write.1.tlog b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/ARM64/Debug/raylib_a.bfb31759.tlog/Microsoft.Build.CPPTasks.ClangCompile.write.1.tlog
new file mode 100644
index 000000000..c944481bc
Binary files /dev/null and b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/ARM64/Debug/raylib_a.bfb31759.tlog/Microsoft.Build.CPPTasks.ClangCompile.write.1.tlog differ
diff --git a/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/ARM64/Debug/raylib_a.bfb31759.tlog/Microsoft.Build.CPPTasks.ClangLink.read.1.tlog b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/ARM64/Debug/raylib_a.bfb31759.tlog/Microsoft.Build.CPPTasks.ClangLink.read.1.tlog
new file mode 100644
index 000000000..3e55d0a90
Binary files /dev/null and b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/ARM64/Debug/raylib_a.bfb31759.tlog/Microsoft.Build.CPPTasks.ClangLink.read.1.tlog differ
diff --git a/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/ARM64/Debug/raylib_a.bfb31759.tlog/Microsoft.Build.CPPTasks.ClangLink.write.1.tlog b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/ARM64/Debug/raylib_a.bfb31759.tlog/Microsoft.Build.CPPTasks.ClangLink.write.1.tlog
new file mode 100644
index 000000000..87ebdbcfc
Binary files /dev/null and b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/ARM64/Debug/raylib_a.bfb31759.tlog/Microsoft.Build.CPPTasks.ClangLink.write.1.tlog differ
diff --git a/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/ARM64/Debug/raylib_a.bfb31759.tlog/clang.command.1.tlog b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/ARM64/Debug/raylib_a.bfb31759.tlog/clang.command.1.tlog
new file mode 100644
index 000000000..c4358b976
Binary files /dev/null and b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/ARM64/Debug/raylib_a.bfb31759.tlog/clang.command.1.tlog differ
diff --git a/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/ARM64/Debug/raylib_a.bfb31759.tlog/raylib_android.NativeActivity.lastbuildstate b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/ARM64/Debug/raylib_a.bfb31759.tlog/raylib_android.NativeActivity.lastbuildstate
new file mode 100644
index 000000000..8b8cac1ea
--- /dev/null
+++ b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/ARM64/Debug/raylib_a.bfb31759.tlog/raylib_android.NativeActivity.lastbuildstate
@@ -0,0 +1,2 @@
+PlatformToolSet=Clang_5_0:VCToolArchitecture=Native32Bit:TargetPlatformVersion=29.0:
+Debug|ARM64|C:\raylib-master\projects\VS2019-Android\raylib_android\|
diff --git a/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/ARM64/Debug/raylib_a.bfb31759.tlog/raylib_android.NativeActivity.write.1u.tlog b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/ARM64/Debug/raylib_a.bfb31759.tlog/raylib_android.NativeActivity.write.1u.tlog
new file mode 100644
index 000000000..94a3ad3ce
Binary files /dev/null and b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/ARM64/Debug/raylib_a.bfb31759.tlog/raylib_android.NativeActivity.write.1u.tlog differ
diff --git a/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/ARM64/Debug/raylib_android.NativeActivity.log b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/ARM64/Debug/raylib_android.NativeActivity.log
new file mode 100644
index 000000000..c11787cca
--- /dev/null
+++ b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/ARM64/Debug/raylib_android.NativeActivity.log
@@ -0,0 +1,5 @@
+ ANDROID_HOME=C:\\Microsoft\AndroidSDK\25
+ ANT_HOME=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Apps\apache-ant-1.9.3
+ JAVA_HOME=C:\Program Files\Android\jdk\microsoft_dist_openjdk_1.8.0.25
+ NDK_ROOT=C:\Users\VadimPC\AppData\Local\Android\Sdk\ndk\21.1.6352462
+ raylib_android.NativeActivity.vcxproj -> C:\raylib-master\projects\VS2019-Android\raylib_android\ARM64\Debug\libmain.so
diff --git a/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/ARM64/Debug/raylib_android.NativeActivity.vcxproj.FileListAbsolute.txt b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/ARM64/Debug/raylib_android.NativeActivity.vcxproj.FileListAbsolute.txt
new file mode 100644
index 000000000..56fbd17e9
--- /dev/null
+++ b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/ARM64/Debug/raylib_android.NativeActivity.vcxproj.FileListAbsolute.txt
@@ -0,0 +1 @@
+C:\raylib-master\projects\VS2019-Android\raylib_android\raylib_android\raylib_android.NativeActivity\ARM64\Debug\libmain.so
diff --git a/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/android_native_app_glue.c b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/android_native_app_glue.c
new file mode 100644
index 000000000..0b8379423
--- /dev/null
+++ b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/android_native_app_glue.c
@@ -0,0 +1,437 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * лицензировано по лицензии Apache License, версия 2.0 ( "Лицензия");
+ *этот файл можно использовать только в соответствии с лицензией.
+ *Копию лицензии можно получить на веб-сайте
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *Если только не требуется в соответствии с применимым законодательством или согласовано в письменном виде, программное обеспечение
+ * распространяется в рамках лицензии на УСЛОВИЯХ "КАК ЕСТЬ",
+ * БЕЗ ГАРАНТИЙ И УСЛОВИЙ ЛЮБОГО РОДА, явно выраженных и подразумеваемых.
+ * См. лицензию для получения информации об определенных разрешениях по использованию языка и
+ * ограничениях в рамках лицензии.
+ *
+ */
+
+#include
+
+#include
+#include
+#include
+#include
+#include
+
+#include "android_native_app_glue.h"
+#include
+
+#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "threaded_app", __VA_ARGS__))
+#define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, "threaded_app", __VA_ARGS__))
+
+/* Для отладочных построений необходимо всегда включать трассировку отладки в этой библиотеке*/
+#ifndef NDEBUG
+# define LOGV(...) ((void)__android_log_print(ANDROID_LOG_VERBOSE, "threaded_app", __VA_ARGS__))
+#else
+# define LOGV(...) ((void)0)
+#endif
+
+static void free_saved_state(struct android_app* android_app) {
+ pthread_mutex_lock(&android_app->mutex);
+ if (android_app->savedState != NULL) {
+ free(android_app->savedState);
+ android_app->savedState = NULL;
+ android_app->savedStateSize = 0;
+ }
+ pthread_mutex_unlock(&android_app->mutex);
+}
+
+int8_t android_app_read_cmd(struct android_app* android_app) {
+ int8_t cmd;
+ if (read(android_app->msgread, &cmd, sizeof(cmd)) == sizeof(cmd)) {
+ switch (cmd) {
+ case APP_CMD_SAVE_STATE:
+ free_saved_state(android_app);
+ break;
+ }
+ return cmd;
+ } else {
+ LOGE("No data on command pipe!");
+ }
+ return -1;
+}
+
+static void print_cur_config(struct android_app* android_app) {
+ char lang[2], country[2];
+ AConfiguration_getLanguage(android_app->config, lang);
+ AConfiguration_getCountry(android_app->config, country);
+
+ LOGV("Config: mcc=%d mnc=%d lang=%c%c cnt=%c%c orien=%d touch=%d dens=%d "
+ "keys=%d nav=%d keysHid=%d navHid=%d sdk=%d size=%d long=%d "
+ "modetype=%d modenight=%d",
+ AConfiguration_getMcc(android_app->config),
+ AConfiguration_getMnc(android_app->config),
+ lang[0], lang[1], country[0], country[1],
+ AConfiguration_getOrientation(android_app->config),
+ AConfiguration_getTouchscreen(android_app->config),
+ AConfiguration_getDensity(android_app->config),
+ AConfiguration_getKeyboard(android_app->config),
+ AConfiguration_getNavigation(android_app->config),
+ AConfiguration_getKeysHidden(android_app->config),
+ AConfiguration_getNavHidden(android_app->config),
+ AConfiguration_getSdkVersion(android_app->config),
+ AConfiguration_getScreenSize(android_app->config),
+ AConfiguration_getScreenLong(android_app->config),
+ AConfiguration_getUiModeType(android_app->config),
+ AConfiguration_getUiModeNight(android_app->config));
+}
+
+void android_app_pre_exec_cmd(struct android_app* android_app, int8_t cmd) {
+ switch (cmd) {
+ case APP_CMD_INPUT_CHANGED:
+ LOGV("APP_CMD_INPUT_CHANGED\n");
+ pthread_mutex_lock(&android_app->mutex);
+ if (android_app->inputQueue != NULL) {
+ AInputQueue_detachLooper(android_app->inputQueue);
+ }
+ android_app->inputQueue = android_app->pendingInputQueue;
+ if (android_app->inputQueue != NULL) {
+ LOGV("Attaching input queue to looper");
+ AInputQueue_attachLooper(android_app->inputQueue,
+ android_app->looper, LOOPER_ID_INPUT, NULL,
+ &android_app->inputPollSource);
+ }
+ pthread_cond_broadcast(&android_app->cond);
+ pthread_mutex_unlock(&android_app->mutex);
+ break;
+
+ case APP_CMD_INIT_WINDOW:
+ LOGV("APP_CMD_INIT_WINDOW\n");
+ pthread_mutex_lock(&android_app->mutex);
+ android_app->window = android_app->pendingWindow;
+ pthread_cond_broadcast(&android_app->cond);
+ pthread_mutex_unlock(&android_app->mutex);
+ break;
+
+ case APP_CMD_TERM_WINDOW:
+ LOGV("APP_CMD_TERM_WINDOW\n");
+ pthread_cond_broadcast(&android_app->cond);
+ break;
+
+ case APP_CMD_RESUME:
+ case APP_CMD_START:
+ case APP_CMD_PAUSE:
+ case APP_CMD_STOP:
+ LOGV("activityState=%d\n", cmd);
+ pthread_mutex_lock(&android_app->mutex);
+ android_app->activityState = cmd;
+ pthread_cond_broadcast(&android_app->cond);
+ pthread_mutex_unlock(&android_app->mutex);
+ break;
+
+ case APP_CMD_CONFIG_CHANGED:
+ LOGV("APP_CMD_CONFIG_CHANGED\n");
+ AConfiguration_fromAssetManager(android_app->config,
+ android_app->activity->assetManager);
+ print_cur_config(android_app);
+ break;
+
+ case APP_CMD_DESTROY:
+ LOGV("APP_CMD_DESTROY\n");
+ android_app->destroyRequested = 1;
+ break;
+ }
+}
+
+void android_app_post_exec_cmd(struct android_app* android_app, int8_t cmd) {
+ switch (cmd) {
+ case APP_CMD_TERM_WINDOW:
+ LOGV("APP_CMD_TERM_WINDOW\n");
+ pthread_mutex_lock(&android_app->mutex);
+ android_app->window = NULL;
+ pthread_cond_broadcast(&android_app->cond);
+ pthread_mutex_unlock(&android_app->mutex);
+ break;
+
+ case APP_CMD_SAVE_STATE:
+ LOGV("APP_CMD_SAVE_STATE\n");
+ pthread_mutex_lock(&android_app->mutex);
+ android_app->stateSaved = 1;
+ pthread_cond_broadcast(&android_app->cond);
+ pthread_mutex_unlock(&android_app->mutex);
+ break;
+
+ case APP_CMD_RESUME:
+ free_saved_state(android_app);
+ break;
+ }
+}
+
+static void android_app_destroy(struct android_app* android_app) {
+ LOGV("android_app_destroy!");
+ free_saved_state(android_app);
+ pthread_mutex_lock(&android_app->mutex);
+ if (android_app->inputQueue != NULL) {
+ AInputQueue_detachLooper(android_app->inputQueue);
+ }
+ AConfiguration_delete(android_app->config);
+ android_app->destroyed = 1;
+ pthread_cond_broadcast(&android_app->cond);
+ pthread_mutex_unlock(&android_app->mutex);
+ // После этого нельзя изменять объект android_app.
+}
+
+static void process_input(struct android_app* app, struct android_poll_source* source) {
+ AInputEvent* event = NULL;
+ while (AInputQueue_getEvent(app->inputQueue, &event) >= 0) {
+ LOGV("New input event: type=%d\n", AInputEvent_getType(event));
+ if (AInputQueue_preDispatchEvent(app->inputQueue, event)) {
+ continue;
+ }
+ int32_t handled = 0;
+ if (app->onInputEvent != NULL) handled = app->onInputEvent(app, event);
+ AInputQueue_finishEvent(app->inputQueue, event, handled);
+ }
+}
+
+static void process_cmd(struct android_app* app, struct android_poll_source* source) {
+ int8_t cmd = android_app_read_cmd(app);
+ android_app_pre_exec_cmd(app, cmd);
+ if (app->onAppCmd != NULL) app->onAppCmd(app, cmd);
+ android_app_post_exec_cmd(app, cmd);
+}
+
+static void* android_app_entry(void* param) {
+ struct android_app* android_app = (struct android_app*)param;
+
+ android_app->config = AConfiguration_new();
+ AConfiguration_fromAssetManager(android_app->config, android_app->activity->assetManager);
+
+ print_cur_config(android_app);
+
+ android_app->cmdPollSource.id = LOOPER_ID_MAIN;
+ android_app->cmdPollSource.app = android_app;
+ android_app->cmdPollSource.process = process_cmd;
+ android_app->inputPollSource.id = LOOPER_ID_INPUT;
+ android_app->inputPollSource.app = android_app;
+ android_app->inputPollSource.process = process_input;
+
+ ALooper* looper = ALooper_prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS);
+ ALooper_addFd(looper, android_app->msgread, LOOPER_ID_MAIN, ALOOPER_EVENT_INPUT, NULL,
+ &android_app->cmdPollSource);
+ android_app->looper = looper;
+
+ pthread_mutex_lock(&android_app->mutex);
+ android_app->running = 1;
+ pthread_cond_broadcast(&android_app->cond);
+ pthread_mutex_unlock(&android_app->mutex);
+
+ android_main(android_app);
+
+ android_app_destroy(android_app);
+ return NULL;
+}
+
+// --------------------------------------------------------------------
+// Взаимодействие NativeАctivity (вызванное из основного потока)
+// --------------------------------------------------------------------
+
+static struct android_app* android_app_create(ANativeActivity* activity,
+ void* savedState, size_t savedStateSize) {
+ struct android_app* android_app = (struct android_app*)malloc(sizeof(struct android_app));
+ memset(android_app, 0, sizeof(struct android_app));
+ android_app->activity = activity;
+
+ pthread_mutex_init(&android_app->mutex, NULL);
+ pthread_cond_init(&android_app->cond, NULL);
+
+ if (savedState != NULL) {
+ android_app->savedState = malloc(savedStateSize);
+ android_app->savedStateSize = savedStateSize;
+ memcpy(android_app->savedState, savedState, savedStateSize);
+ }
+
+ int msgpipe[2];
+ if (pipe(msgpipe)) {
+ LOGE("could not create pipe: %s", strerror(errno));
+ return NULL;
+ }
+ android_app->msgread = msgpipe[0];
+ android_app->msgwrite = msgpipe[1];
+
+ pthread_attr_t attr;
+ pthread_attr_init(&attr);
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+ pthread_create(&android_app->thread, &attr, android_app_entry, android_app);
+
+ // Дождитесь запуска потока.
+ pthread_mutex_lock(&android_app->mutex);
+ while (!android_app->running) {
+ pthread_cond_wait(&android_app->cond, &android_app->mutex);
+ }
+ pthread_mutex_unlock(&android_app->mutex);
+
+ return android_app;
+}
+
+static void android_app_write_cmd(struct android_app* android_app, int8_t cmd) {
+ if (write(android_app->msgwrite, &cmd, sizeof(cmd)) != sizeof(cmd)) {
+ LOGE("Failure writing android_app cmd: %s\n", strerror(errno));
+ }
+}
+
+static void android_app_set_input(struct android_app* android_app, AInputQueue* inputQueue) {
+ pthread_mutex_lock(&android_app->mutex);
+ android_app->pendingInputQueue = inputQueue;
+ android_app_write_cmd(android_app, APP_CMD_INPUT_CHANGED);
+ while (android_app->inputQueue != android_app->pendingInputQueue) {
+ pthread_cond_wait(&android_app->cond, &android_app->mutex);
+ }
+ pthread_mutex_unlock(&android_app->mutex);
+}
+
+static void android_app_set_window(struct android_app* android_app, ANativeWindow* window) {
+ pthread_mutex_lock(&android_app->mutex);
+ if (android_app->pendingWindow != NULL) {
+ android_app_write_cmd(android_app, APP_CMD_TERM_WINDOW);
+ }
+ android_app->pendingWindow = window;
+ if (window != NULL) {
+ android_app_write_cmd(android_app, APP_CMD_INIT_WINDOW);
+ }
+ while (android_app->window != android_app->pendingWindow) {
+ pthread_cond_wait(&android_app->cond, &android_app->mutex);
+ }
+ pthread_mutex_unlock(&android_app->mutex);
+}
+
+static void android_app_set_activity_state(struct android_app* android_app, int8_t cmd) {
+ pthread_mutex_lock(&android_app->mutex);
+ android_app_write_cmd(android_app, cmd);
+ while (android_app->activityState != cmd) {
+ pthread_cond_wait(&android_app->cond, &android_app->mutex);
+ }
+ pthread_mutex_unlock(&android_app->mutex);
+}
+
+static void android_app_free(struct android_app* android_app) {
+ pthread_mutex_lock(&android_app->mutex);
+ android_app_write_cmd(android_app, APP_CMD_DESTROY);
+ while (!android_app->destroyed) {
+ pthread_cond_wait(&android_app->cond, &android_app->mutex);
+ }
+ pthread_mutex_unlock(&android_app->mutex);
+
+ close(android_app->msgread);
+ close(android_app->msgwrite);
+ pthread_cond_destroy(&android_app->cond);
+ pthread_mutex_destroy(&android_app->mutex);
+ free(android_app);
+}
+
+static void onDestroy(ANativeActivity* activity) {
+ LOGV("Destroy: %p\n", activity);
+ android_app_free((struct android_app*)activity->instance);
+}
+
+static void onStart(ANativeActivity* activity) {
+ LOGV("Start: %p\n", activity);
+ android_app_set_activity_state((struct android_app*)activity->instance, APP_CMD_START);
+}
+
+static void onResume(ANativeActivity* activity) {
+ LOGV("Resume: %p\n", activity);
+ android_app_set_activity_state((struct android_app*)activity->instance, APP_CMD_RESUME);
+}
+
+static void* onSaveInstanceState(ANativeActivity* activity, size_t* outLen) {
+ struct android_app* android_app = (struct android_app*)activity->instance;
+ void* savedState = NULL;
+
+ LOGV("SaveInstanceState: %p\n", activity);
+ pthread_mutex_lock(&android_app->mutex);
+ android_app->stateSaved = 0;
+ android_app_write_cmd(android_app, APP_CMD_SAVE_STATE);
+ while (!android_app->stateSaved) {
+ pthread_cond_wait(&android_app->cond, &android_app->mutex);
+ }
+
+ if (android_app->savedState != NULL) {
+ savedState = android_app->savedState;
+ *outLen = android_app->savedStateSize;
+ android_app->savedState = NULL;
+ android_app->savedStateSize = 0;
+ }
+
+ pthread_mutex_unlock(&android_app->mutex);
+
+ return savedState;
+}
+
+static void onPause(ANativeActivity* activity) {
+ LOGV("Pause: %p\n", activity);
+ android_app_set_activity_state((struct android_app*)activity->instance, APP_CMD_PAUSE);
+}
+
+static void onStop(ANativeActivity* activity) {
+ LOGV("Stop: %p\n", activity);
+ android_app_set_activity_state((struct android_app*)activity->instance, APP_CMD_STOP);
+}
+
+static void onConfigurationChanged(ANativeActivity* activity) {
+ struct android_app* android_app = (struct android_app*)activity->instance;
+ LOGV("ConfigurationChanged: %p\n", activity);
+ android_app_write_cmd(android_app, APP_CMD_CONFIG_CHANGED);
+}
+
+static void onLowMemory(ANativeActivity* activity) {
+ struct android_app* android_app = (struct android_app*)activity->instance;
+ LOGV("LowMemory: %p\n", activity);
+ android_app_write_cmd(android_app, APP_CMD_LOW_MEMORY);
+}
+
+static void onWindowFocusChanged(ANativeActivity* activity, int focused) {
+ LOGV("WindowFocusChanged: %p -- %d\n", activity, focused);
+ android_app_write_cmd((struct android_app*)activity->instance,
+ focused ? APP_CMD_GAINED_FOCUS : APP_CMD_LOST_FOCUS);
+}
+
+static void onNativeWindowCreated(ANativeActivity* activity, ANativeWindow* window) {
+ LOGV("NativeWindowCreated: %p -- %p\n", activity, window);
+ android_app_set_window((struct android_app*)activity->instance, window);
+}
+
+static void onNativeWindowDestroyed(ANativeActivity* activity, ANativeWindow* window) {
+ LOGV("NativeWindowDestroyed: %p -- %p\n", activity, window);
+ android_app_set_window((struct android_app*)activity->instance, NULL);
+}
+
+static void onInputQueueCreated(ANativeActivity* activity, AInputQueue* queue) {
+ LOGV("InputQueueCreated: %p -- %p\n", activity, queue);
+ android_app_set_input((struct android_app*)activity->instance, queue);
+}
+
+static void onInputQueueDestroyed(ANativeActivity* activity, AInputQueue* queue) {
+ LOGV("InputQueueDestroyed: %p -- %p\n", activity, queue);
+ android_app_set_input((struct android_app*)activity->instance, NULL);
+}
+
+void ANativeActivity_onCreate(ANativeActivity* activity,
+ void* savedState, size_t savedStateSize) {
+ LOGV("Creating: %p\n", activity);
+ activity->callbacks->onDestroy = onDestroy;
+ activity->callbacks->onStart = onStart;
+ activity->callbacks->onResume = onResume;
+ activity->callbacks->onSaveInstanceState = onSaveInstanceState;
+ activity->callbacks->onPause = onPause;
+ activity->callbacks->onStop = onStop;
+ activity->callbacks->onConfigurationChanged = onConfigurationChanged;
+ activity->callbacks->onLowMemory = onLowMemory;
+ activity->callbacks->onWindowFocusChanged = onWindowFocusChanged;
+ activity->callbacks->onNativeWindowCreated = onNativeWindowCreated;
+ activity->callbacks->onNativeWindowDestroyed = onNativeWindowDestroyed;
+ activity->callbacks->onInputQueueCreated = onInputQueueCreated;
+ activity->callbacks->onInputQueueDestroyed = onInputQueueDestroyed;
+
+ activity->instance = android_app_create(activity, savedState, savedStateSize);
+}
diff --git a/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/android_native_app_glue.h b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/android_native_app_glue.h
new file mode 100644
index 000000000..c7269a444
--- /dev/null
+++ b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/android_native_app_glue.h
@@ -0,0 +1,344 @@
+/*
+ * © 2010 The Android Open Source Project
+ *
+ * Лицензировано по лицензии Apache License, версия 2.0 ( "Лицензия");
+ *этот файл можно использовать только в соответствии с лицензией.
+ *Копию лицензии можно получить на веб-сайте
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *Если только не требуется в соответствии с применимым законодательством или согласовано в письменном виде, программное обеспечение
+ * распространяется в рамках лицензии на УСЛОВИЯХ "КАК ЕСТЬ",
+ * БЕЗ ГАРАНТИЙ И УСЛОВИЙ ЛЮБОГО РОДА, явно выраженных и подразумеваемых.
+ * См. лицензию для получения информации об определенных разрешениях по использованию языка и
+ * ограничениях в рамках лицензии.
+ *
+ */
+
+#ifndef _ANDROID_NATIVE_APP_GLUE_H
+#define _ANDROID_NATIVE_APP_GLUE_H
+
+#include
+#include
+#include
+
+#include
+#include
+#include
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Интерфейс NativeActivity, предоставленный ,
+ * основан на наборе предоставленных приложением обратных вызовов, которые вызываются
+ *основным потоком действия при возникновении определенных событий.
+ *
+ * Это означает, что ни один из данных обратных вызовов _не_ _должен_ блокироваться, иначе
+ * существует риск принудительного закрытия приложения системой. Эта модель программирования
+ * прямая, простая, но имеет ограничения.
+ *
+ * Статическая библиотека threaded_native_app используется для обеспечения другой
+ * модели выполнения, в которой приложение может реализовать свой собственный цикл главного события
+ * в другом потоке вместо этого. Это работает так:
+ *
+ * 1/ Приложение должно предоставить функцию с именем android_main(), которая
+ * будет вызываться при создании действия в новом потоке,
+ * отличающемся от основного потока действия.
+ *
+ * 2/ android_main() получает указатель на допустимую структуру android_app,
+ * которая содержит ссылки на другие важные объекты, например экземпляр объекта
+ * ANativeActivity, где выполняется приложение.
+ *
+ * 3/ Объект android_app содержит экземпляр ALooper, который уже
+ * ожидает две важных вещи:
+ *
+ * - событий жизненного цикла действия (например, "pause", "resume"). См. объявления APP_CMD_XXX
+ * ниже.
+ *
+ * - входных событий, поступающих из очереди AInputQueue, присоединенной к действию.
+ *
+ * Каждое из этих событий соответствует идентификатору ALooper, возвращенному
+ * ALooper_pollOnce со значениями LOOPER_ID_MAIN и LOOPER_ID_INPUT,
+ *, соответственно.
+ *
+ * Ваше приложение может использовать тот же ALooper для прослушивания дополнительных
+ * дескрипторов файла. Они могут быть основаны либо на обратных вызовах, либо поступают с идентификаторами возврата,
+ * начинающимися с LOOPER_ID_USER.
+ *
+ * 4/ При получении события LOOPER_ID_MAIN или LOOPER_ID_INPUT
+ * возвращенные данные будут указывать на структуру android_poll_source. Для нее
+ * можно вызвать функцию process() и заполнить android_app->onAppCmd
+ * и android_app->onInputEvent, для того чтобы они вызывались для вашей собственной обработки
+ * события.
+ *
+ * Вместо этого можно вызвать функции нижнего уровня для чтения и обработки
+ * данных непосредственно... посмотрите на реализации process_cmd() и process_input()
+ * в приклеивании, чтобы выяснить, как это делается.
+ *
+ * См. пример "native-activity" в NDK с
+ * полной демонстрацией использования. Также посмотрите JavaDoc в NativeActivity.
+ */
+
+struct android_app;
+
+/**
+ * Данные, связанные с ALooper fd, которые будут возвращаться как outData
+ * при готовности данных в этом источнике.
+ */
+struct android_poll_source {
+ // Идентификатор данного источника. Может быть LOOPER_ID_MAIN или
+ // LOOPER_ID_INPUT.
+ int32_t id;
+
+ // android_app, с которым связан данный идентификатор.
+ struct android_app* app;
+
+ // Функция, вызываемая для стандартной обработки данных из
+ // этого источника.
+ void (*process)(struct android_app* app, struct android_poll_source* source);
+};
+
+/**
+ * Это интерфейс стандартного кода приклеивания поточного
+ * приложения. В этой модели код приложения выполняется
+ * в своем собственном потоке, отдельном от основного потока процесса.
+ * Не требуется связь данного потока с ВМ Java
+ *, хотя это необходимо для выполнения вызовов JNI любых
+ * объектов Java.
+ */
+struct android_app {
+ // Приложение может поместить указатель на свой собственный объект состояния
+ // здесь, если нужно.
+ void* userData;
+
+ // Введите здесь код функции для обработки основных команд приложения (APP_CMD_*)
+ void (*onAppCmd)(struct android_app* app, int32_t cmd);
+
+ // Введите здесь код функции для обработки входных событий. Сейчас
+ // событие уже было предварительно отправлено и будет завершено при
+ // возврате. Верните 1, если событие обработано, 0 — для любой диспетчеризации
+ // по умолчанию.
+ int32_t (*onInputEvent)(struct android_app* app, AInputEvent* event);
+
+ // Экземпляр объекта ANativeActivity, в котором выполняется это приложение.
+ ANativeActivity* activity;
+
+ // Текущая конфигурация, в которой выполняется это приложение.
+ AConfiguration* config;
+
+ // Это последнее сохраненное состояние экземпляра, предоставленное во время создания.
+ // Значение равно NULL, если состояния не было. Можно использовать это по мере необходимости;
+ // память останется доступной до вызова android_app_exec_cmd() для
+ // APP_CMD_RESUME, после чего она будет освобождена, а savedState получит значение NULL.
+ // Эти переменные необходимо изменять только при обработке APP_CMD_SAVE_STATE,
+ // когда их значения будут инициализироваться в NULL и можно будет выполнить malloc для
+ // состояния и поместить здесь информацию. В этом случае память будет
+ // освобождена позднее.
+ void* savedState;
+ size_t savedStateSize;
+
+ // ALooper, связанный с потоком приложения.
+ ALooper* looper;
+
+ // Если значение не равно NULL, то это входная очередь, из которой приложение будет
+ // получать входные события пользователя.
+ AInputQueue* inputQueue;
+
+ // Если значение не равно NULL, то это поверхность окна, в котором приложение может рисовать.
+ ANativeWindow* window;
+
+ // Текущий прямоугольник содержимого окна. Это область, в которой
+ // должно помещаться содержимое окна, чтобы его видел пользователь.
+ ARect contentRect;
+
+ // Текущее состояние действия приложения. Может быть APP_CMD_START,
+ // APP_CMD_RESUME, APP_CMD_PAUSE или APP_CMD_STOP; см. ниже.
+ int activityState;
+
+ // Значение не равно нулю, когда NativeActivity приложения
+ // разрушается и ожидает завершения потока приложения.
+ int destroyRequested;
+
+ // -------------------------------------------------
+ // Ниже показан "частная" реализация кода прилипания.
+
+ pthread_mutex_t mutex;
+ pthread_cond_t cond;
+
+ int msgread;
+ int msgwrite;
+
+ pthread_t thread;
+
+ struct android_poll_source cmdPollSource;
+ struct android_poll_source inputPollSource;
+
+ int running;
+ int stateSaved;
+ int destroyed;
+ int redrawNeeded;
+ AInputQueue* pendingInputQueue;
+ ANativeWindow* pendingWindow;
+ ARect pendingContentRect;
+};
+
+enum {
+ /**
+ * Идентификатор данных Looper команд, поступающих из основного потока приложения, который
+ * возвращается как идентификатор от ALooper_pollOnce(). Данные для этого идентификатора
+ * являются указателем на структуру android_poll_source.
+ * Их можно извлечь и обработать с помощью android_app_read_cmd()
+ * и android_app_exec_cmd().
+ */
+ LOOPER_ID_MAIN = 1,
+
+ /**
+ * Идентификатор данных Looper событий, поступающий из AInputQueue окна
+ * приложения, который возвращается как идентификатор из
+ * ALooper_pollOnce(). Данные этого идентификатора являются указателем на структуру
+ * android_poll_source. Их можно прочитать через объект inputQueue
+ * приложения android_app.
+ */
+ LOOPER_ID_INPUT = 2,
+
+ /**
+ * Запуск определяемых пользователем идентификаторов ALooper.
+ */
+ LOOPER_ID_USER = 3,
+};
+
+enum {
+ /**
+ * Команда из основного потока: AInputQueue изменена. После обработки
+ * этой команды android_app->inputQueue будет обновлена в новую очередь
+ * (или NULL).
+ */
+ APP_CMD_INPUT_CHANGED,
+
+ /**
+ * Команда из основного потока: новое окно ANativeWindow готово к использованию. После
+ * получения этой команды окно android_app-> будет содержать новую поверхность
+ *окна.
+ */
+ APP_CMD_INIT_WINDOW,
+
+ /**
+ * Команда из основного потока: существующее окно ANativeWindow необходимо
+ * прекратить. После получения этой команды окно android_app->по-прежнему
+ * содержит существующее окно; после вызова android_app_exec_cmd
+ * оно получит значение NULL.
+ */
+ APP_CMD_TERM_WINDOW,
+
+ /**
+ * Команда из основного потока: текущее окно ANativeWindow изменило размер.
+ * Перерисуйте согласно новом размеру.
+ */
+ APP_CMD_WINDOW_RESIZED,
+
+ /**
+ * Команда из основного потока: системе необходимо, чтобы текущее окно ANativeWindow
+ * было перерисовано. Необходимо перерисовать окно перед ее передачей в
+ * android_app_exec_cmd(), чтобы избежать переходных сбоев рисования.
+ */
+ APP_CMD_WINDOW_REDRAW_NEEDED,
+
+ /**
+ * Команда из основного потока: область содержимого окна изменена
+ * таким образом, что из функционального ввода окно показывается или скрывается. Можно
+ * найти новый прямоугольник содержимого в android_app::contentRect.
+ */
+ APP_CMD_CONTENT_RECT_CHANGED,
+
+ /**
+ * Команда из основного потока: окно действия приложения получило
+ * фокус ввода.
+ */
+ APP_CMD_GAINED_FOCUS,
+
+ /**
+ * Команда из основного потока: окно действия приложения потеряло
+ * фокус ввода.
+ */
+ APP_CMD_LOST_FOCUS,
+
+ /**
+ * Команда из основного потока: изменена текущая конфигурация устройства.
+ */
+ APP_CMD_CONFIG_CHANGED,
+
+ /**
+ * Команда из основного потока: системе не хватает памяти.
+ * Попробуйте уменьшить использование памяти.
+ */
+ APP_CMD_LOW_MEMORY,
+
+ /**
+ * Команда из основного потока: действие приложения было запущено.
+ */
+ APP_CMD_START,
+
+ /**
+ * Команда из основного потока: действие приложения было возобновлено.
+ */
+ APP_CMD_RESUME,
+
+ /**
+ * Команда из основного потока: приложение должно создать новое сохраненное состояние
+ * для себя, чтобы восстанавливаться из него позднее в случае необходимости. Если вы сохранили состояние,
+ * выделите его с использованием malloc и поместите в android_app.savedState с
+ * размером android_app.savedStateSize. Память будет освобождена
+ * позднее.
+ */
+ APP_CMD_SAVE_STATE,
+
+ /**
+ * Команда из основного потока: пауза в действии приложения.
+ */
+ APP_CMD_PAUSE,
+
+ /**
+ * Команда из основного потока: действие приложения было остановлено.
+ */
+ APP_CMD_STOP,
+
+ /**
+ * Команда из основного потока: действие приложения уничтожается,
+ * и ожидает очистки потока приложения и выхода перед обработкой.
+ */
+ APP_CMD_DESTROY,
+};
+
+/**
+ * Вызовите, когда ALooper_pollAll() возвращает LOOPER_ID_MAIN, при чтении следующего сообщения команды
+ *приложения.
+ */
+int8_t android_app_read_cmd(struct android_app* android_app);
+
+/**
+ * Вызовите с помощью команды, возвращенной android_app_read_cmd() для выполнения
+ * начальной предварительной обработки данной команды. Можно выполнить собственные
+ * действия для команды после вызова этой функции.
+ */
+void android_app_pre_exec_cmd(struct android_app* android_app, int8_t cmd);
+
+/**
+ * Вызовите с помощью команды, возвращенной android_app_read_cmd(), для
+ * окончательной предварительной обработки данной команды. Необходимо завершить собственные
+ * действия с командой до вызова этой функции.
+ */
+void android_app_post_exec_cmd(struct android_app* android_app, int8_t cmd);
+
+/**
+ * Это функция, которую должен реализовать код приложения, представляет собой
+ * главный вход в приложение.
+ */
+extern void android_main(struct android_app* app);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _ANDROID_NATIVE_APP_GLUE_H */
diff --git a/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/main.c b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/main.c
new file mode 100644
index 000000000..0b9ff0200
--- /dev/null
+++ b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/main.c
@@ -0,0 +1,228 @@
+/*******************************************************************************************
+*
+* raylib - Simple Game template
+*
+*
+*
+*
+* This game has been created using raylib (www.raylib.com)
+* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details)
+*
+* Copyright (c) 2014-2021 Ramon Santamaria (@raysan5)
+*
+* Adapt for Visual Studio: Vadim Boev (Kronka Dev)
+*
+********************************************************************************************/
+#include "android_native_app_glue.h"
+
+#include "../../../../../src/raylib.h"
+
+#define MAX_COLORS_COUNT 23 // Number of colors available
+
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ // Setup display size (every frame to accommodate for window resizing)
+ int window_width = 500; //ANativeWindow_getWidth(g_Window);
+ int window_height = 500; //ANativeWindow_getHeight(g_Window);
+
+ InitWindow(window_width, window_height, "raylib [textures] example - mouse painting");
+
+ // Colours to choose from
+ Color colors[MAX_COLORS_COUNT] = {
+ RAYWHITE, YELLOW, GOLD, ORANGE, PINK, RED, MAROON, GREEN, LIME, DARKGREEN,
+ SKYBLUE, BLUE, DARKBLUE, PURPLE, VIOLET, DARKPURPLE, BEIGE, BROWN, DARKBROWN,
+ LIGHTGRAY, GRAY, DARKGRAY, BLACK };
+
+ // Define colorsRecs data (for every rectangle)
+ Rectangle colorsRecs[MAX_COLORS_COUNT] = { 0 };
+
+ for (int i = 0; i < MAX_COLORS_COUNT; i++)
+ {
+ colorsRecs[i].x = 10 + 30.0f * i + 2 * i;
+ colorsRecs[i].y = 10;
+ colorsRecs[i].width = 30;
+ colorsRecs[i].height = 30;
+ }
+
+ int colorSelected = 0;
+ int colorSelectedPrev = colorSelected;
+ int colorMouseHover = 0;
+ float brushSize = 20.0f;
+ bool mouseWasPressed = false;
+
+ Rectangle btnSaveRec = { 750, 10, 40, 30 };
+ bool btnSaveMouseHover = false;
+ bool showSaveMessage = false;
+ int saveMessageCounter = 0;
+
+ // Create a RenderTexture2D to use as a canvas
+ RenderTexture2D target = LoadRenderTexture(window_width, window_height);
+
+ // Clear render texture before entering the game loop
+ BeginTextureMode(target);
+ ClearBackground(colors[0]);
+ EndTextureMode();
+
+ SetTargetFPS(120); // Set our game to run at 120 frames-per-second
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ Vector2 mousePos = GetMousePosition();
+
+ // Move between colors with keys
+ if (IsKeyPressed(KEY_RIGHT)) colorSelected++;
+ else if (IsKeyPressed(KEY_LEFT)) colorSelected--;
+
+ if (colorSelected >= MAX_COLORS_COUNT) colorSelected = MAX_COLORS_COUNT - 1;
+ else if (colorSelected < 0) colorSelected = 0;
+
+ // Choose color with mouse
+ for (int i = 0; i < MAX_COLORS_COUNT; i++)
+ {
+ if (CheckCollisionPointRec(mousePos, colorsRecs[i]))
+ {
+ colorMouseHover = i;
+ break;
+ }
+ else colorMouseHover = -1;
+ }
+
+ if ((colorMouseHover >= 0) && IsMouseButtonPressed(MOUSE_BUTTON_LEFT))
+ {
+ colorSelected = colorMouseHover;
+ colorSelectedPrev = colorSelected;
+ }
+
+ // Change brush size
+ brushSize += GetMouseWheelMove() * 5;
+ if (brushSize < 2) brushSize = 2;
+ if (brushSize > 50) brushSize = 50;
+
+ if (IsKeyPressed(KEY_C))
+ {
+ // Clear render texture to clear color
+ BeginTextureMode(target);
+ ClearBackground(colors[0]);
+ EndTextureMode();
+ }
+
+ if (IsMouseButtonDown(MOUSE_BUTTON_LEFT) || (GetGestureDetected() == GESTURE_DRAG))
+ {
+ // Paint circle into render texture
+ // NOTE: To avoid discontinuous circles, we could store
+ // previous-next mouse points and just draw a line using brush size
+ BeginTextureMode(target);
+ if (mousePos.y > 50) DrawCircle((int)mousePos.x, (int)mousePos.y, brushSize, colors[colorSelected]);
+ EndTextureMode();
+ }
+
+ if (IsMouseButtonDown(MOUSE_BUTTON_RIGHT))
+ {
+ if (!mouseWasPressed)
+ {
+ colorSelectedPrev = colorSelected;
+ colorSelected = 0;
+ }
+
+ mouseWasPressed = true;
+
+ // Erase circle from render texture
+ BeginTextureMode(target);
+ if (mousePos.y > 50) DrawCircle((int)mousePos.x, (int)mousePos.y, brushSize, colors[0]);
+ EndTextureMode();
+ }
+ else if (IsMouseButtonReleased(MOUSE_BUTTON_RIGHT) && mouseWasPressed)
+ {
+ colorSelected = colorSelectedPrev;
+ mouseWasPressed = false;
+ }
+
+ // Check mouse hover save button
+ if (CheckCollisionPointRec(mousePos, btnSaveRec)) btnSaveMouseHover = true;
+ else btnSaveMouseHover = false;
+
+ // Image saving logic
+ // NOTE: Saving painted texture to a default named image
+ if ((btnSaveMouseHover && IsMouseButtonReleased(MOUSE_BUTTON_LEFT)) || IsKeyPressed(KEY_S))
+ {
+ Image image = LoadImageFromTexture(target.texture);
+ ImageFlipVertical(&image);
+ ExportImage(image, "my_amazing_texture_painting.png");
+ UnloadImage(image);
+ showSaveMessage = true;
+ }
+
+ if (showSaveMessage)
+ {
+ // On saving, show a full screen message for 2 seconds
+ saveMessageCounter++;
+ if (saveMessageCounter > 240)
+ {
+ showSaveMessage = false;
+ saveMessageCounter = 0;
+ }
+ }
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ // NOTE: Render texture must be y-flipped due to default OpenGL coordinates (left-bottom)
+ DrawTextureRec(target.texture, (Rectangle) { 0, 0, (float)target.texture.width, (float)-target.texture.height }, (Vector2) { 0, 0 }, WHITE);
+
+ // Draw drawing circle for reference
+ if (mousePos.y > 50)
+ {
+ if (IsMouseButtonDown(MOUSE_BUTTON_RIGHT)) DrawCircleLines((int)mousePos.x, (int)mousePos.y, brushSize, GRAY);
+ else DrawCircle(GetMouseX(), GetMouseY(), brushSize, colors[colorSelected]);
+ }
+
+ // Draw top panel
+ DrawRectangle(0, 0, GetScreenWidth(), 50, RAYWHITE);
+ DrawLine(0, 50, GetScreenWidth(), 50, LIGHTGRAY);
+
+ // Draw color selection rectangles
+ for (int i = 0; i < MAX_COLORS_COUNT; i++) DrawRectangleRec(colorsRecs[i], colors[i]);
+ DrawRectangleLines(10, 10, 30, 30, LIGHTGRAY);
+
+ if (colorMouseHover >= 0) DrawRectangleRec(colorsRecs[colorMouseHover], Fade(WHITE, 0.6f));
+
+ DrawRectangleLinesEx((Rectangle) {
+ colorsRecs[colorSelected].x - 2, colorsRecs[colorSelected].y - 2,
+ colorsRecs[colorSelected].width + 4, colorsRecs[colorSelected].height + 4
+ }, 2, BLACK);
+
+ // Draw save image button
+ DrawRectangleLinesEx(btnSaveRec, 2, btnSaveMouseHover ? RED : BLACK);
+ DrawText("SAVE!", 755, 20, 10, btnSaveMouseHover ? RED : BLACK);
+
+ // Draw save image message
+ if (showSaveMessage)
+ {
+ DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), Fade(RAYWHITE, 0.8f));
+ DrawRectangle(0, 150, GetScreenWidth(), 80, BLACK);
+ DrawText("IMAGE SAVED: my_amazing_texture_painting.png", 150, 180, 20, RAYWHITE);
+ }
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ UnloadRenderTexture(target); // Unload render texture
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/raylib_android.NativeActivity.vcxproj b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/raylib_android.NativeActivity.vcxproj
new file mode 100644
index 000000000..50e15a45e
--- /dev/null
+++ b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/raylib_android.NativeActivity.vcxproj
@@ -0,0 +1,226 @@
+
+
+
+
+ Debug
+ ARM
+
+
+ Release
+ ARM
+
+
+ Debug
+ ARM64
+
+
+ Release
+ ARM64
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+ Debug
+ x86
+
+
+ Release
+ x86
+
+
+
+ {bfb31759-4fca-4503-bc7c-a97f705efdb2}
+ Android
+ raylib_android
+ en-US
+ 14.0
+ Android
+ 3.0
+
+
+
+ DynamicLibrary
+ true
+ Clang_5_0
+
+
+ DynamicLibrary
+ false
+ Clang_5_0
+
+
+ DynamicLibrary
+ true
+ Clang_5_0
+
+
+ DynamicLibrary
+ false
+ Clang_5_0
+
+
+ DynamicLibrary
+ true
+ Clang_5_0
+ android-29
+
+
+ DynamicLibrary
+ false
+ Clang_5_0
+
+
+ DynamicLibrary
+ true
+ Clang_5_0
+
+
+ DynamicLibrary
+ false
+ Clang_5_0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ libmain
+
+
+
+
+
+
+
+
+
+
+ NotUsing
+ pch.h
+ CompileAsC
+ c99
+ Default
+ CompileAsC
+
+
+ %(LibraryDependencies);EGL;GLESv2;log;android;c;m;raylib
+ ../../../../../src/;%(AdditionalLibraryDirectories)
+
+
+
+
+ NotUsing
+ pch.h
+ CompileAsC
+ c99
+ Default
+ CompileAsC
+
+
+ %(LibraryDependencies);GLESv1_CM;EGL;
+ .;%(AdditionalLibraryDirectories)
+
+
+
+
+ Use
+ pch.h
+ CompileAsCpp
+
+
+ %(LibraryDependencies);GLESv1_CM;EGL;
+
+
+
+
+ Use
+ pch.h
+ CompileAsCpp
+
+
+ %(LibraryDependencies);GLESv1_CM;EGL;
+
+
+
+
+ Use
+ pch.h
+ CompileAsCpp
+
+
+ %(LibraryDependencies);GLESv1_CM;EGL;
+
+
+
+
+ Use
+ pch.h
+ CompileAsCpp
+
+
+ %(LibraryDependencies);GLESv1_CM;EGL;
+
+
+
+
+ Use
+ pch.h
+ CompileAsCpp
+
+
+ %(LibraryDependencies);GLESv1_CM;EGL;
+
+
+
+
+ Use
+ pch.h
+ CompileAsCpp
+
+
+ %(LibraryDependencies);GLESv1_CM;EGL;
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/raylib_android.NativeActivity.vcxproj.filters b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/raylib_android.NativeActivity.vcxproj.filters
new file mode 100644
index 000000000..e9a26e2dd
--- /dev/null
+++ b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/raylib_android.NativeActivity.vcxproj.filters
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/raylib_android.NativeActivity.vcxproj.user b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/raylib_android.NativeActivity.vcxproj.user
new file mode 100644
index 000000000..0f14913f3
--- /dev/null
+++ b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.NativeActivity/raylib_android.NativeActivity.vcxproj.user
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM/Debug/raylib_android.Packaging.androidproj.AssemblyReference.cache b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM/Debug/raylib_android.Packaging.androidproj.AssemblyReference.cache
new file mode 100644
index 000000000..635bc1dc2
Binary files /dev/null and b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM/Debug/raylib_android.Packaging.androidproj.AssemblyReference.cache differ
diff --git a/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/FileStringReplace.incremental b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/FileStringReplace.incremental
new file mode 100644
index 000000000..791ba1e45
--- /dev/null
+++ b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/FileStringReplace.incremental
@@ -0,0 +1 @@
+$(AntDependencies)=;$(ApplicationId)=applicationId = "";$(ConfigurationType)=application;$(AarDependencies)=;$(AarDependenciesSettings)=;$(ApplicationName)=raylib_android;$(AndroidAppLibName)=raylib_android;$(AndroidBuildToolsVersion)=25.0.3;$(AndroidAPILevelNumber)=25;$(androidapilevel)=android-25;$(projectname)=raylib_android.Packaging;
\ No newline at end of file
diff --git a/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/Package/bin/AndroidManifest.xml b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/Package/bin/AndroidManifest.xml
new file mode 100644
index 000000000..f5ac70115
--- /dev/null
+++ b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/Package/bin/AndroidManifest.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/Package/bin/AndroidManifest.xml.d b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/Package/bin/AndroidManifest.xml.d
new file mode 100644
index 000000000..ce7380ba0
--- /dev/null
+++ b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/Package/bin/AndroidManifest.xml.d
@@ -0,0 +1,2 @@
+C:\raylib-master\projects\VS2019-Android\raylib_android\raylib_android\raylib_android.Packaging\ARM64\Debug\Package\bin\AndroidManifest.xml : \
+C:\raylib-master\projects\VS2019-Android\raylib_android\raylib_android\raylib_android.Packaging\ARM64\Debug\Package\AndroidManifest.xml \
diff --git a/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/Package/bin/build.prop b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/Package/bin/build.prop
new file mode 100644
index 000000000..01a93bae2
--- /dev/null
+++ b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/Package/bin/build.prop
@@ -0,0 +1,10 @@
+#Last build type
+#Thu, 23 Sep 2021 15:30:05 +0300
+
+build.last.target=debug
+
+build.last.is.instrumented=false
+
+build.last.is.packaging.debug=true
+
+build.last.is.signing.debug=true
diff --git a/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/Package/bin/raylib_android.Packaging-debug-unaligned.apk b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/Package/bin/raylib_android.Packaging-debug-unaligned.apk
new file mode 100644
index 000000000..1cf1d94b7
Binary files /dev/null and b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/Package/bin/raylib_android.Packaging-debug-unaligned.apk differ
diff --git a/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/Package/bin/raylib_android.Packaging-debug-unaligned.apk.d b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/Package/bin/raylib_android.Packaging-debug-unaligned.apk.d
new file mode 100644
index 000000000..f418abf8a
--- /dev/null
+++ b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/Package/bin/raylib_android.Packaging-debug-unaligned.apk.d
@@ -0,0 +1,4 @@
+C:\raylib-master\projects\VS2019-Android\raylib_android\raylib_android\raylib_android.Packaging\ARM64\Debug\Package\bin\raylib_android.Packaging-debug-unaligned.apk : \
+C:\raylib-master\projects\VS2019-Android\raylib_android\raylib_android\raylib_android.Packaging\ARM64\Debug\Package\bin\raylib_android.Packaging.ap_ \
+C:\raylib-master\projects\VS2019-Android\raylib_android\raylib_android\raylib_android.Packaging\ARM64\Debug\Package\libs\arm64-v8a\gdbserver \
+C:\raylib-master\projects\VS2019-Android\raylib_android\raylib_android\raylib_android.Packaging\ARM64\Debug\Package\libs\arm64-v8a\libmain.so \
diff --git a/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/Package/bin/raylib_android.Packaging.ap_ b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/Package/bin/raylib_android.Packaging.ap_
new file mode 100644
index 000000000..b7114edd6
Binary files /dev/null and b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/Package/bin/raylib_android.Packaging.ap_ differ
diff --git a/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/Package/bin/raylib_android.Packaging.ap_.d b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/Package/bin/raylib_android.Packaging.ap_.d
new file mode 100644
index 000000000..da1bb9aff
--- /dev/null
+++ b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/Package/bin/raylib_android.Packaging.ap_.d
@@ -0,0 +1,3 @@
+C:\raylib-master\projects\VS2019-Android\raylib_android\raylib_android\raylib_android.Packaging\ARM64\Debug\Package\bin\raylib_android.Packaging.ap_ \
+ : C:\raylib-master\projects\VS2019-Android\raylib_android\raylib_android\raylib_android.Packaging\ARM64\Debug\Package\res\values\strings.xml \
+C:\raylib-master\projects\VS2019-Android\raylib_android\raylib_android\raylib_android.Packaging\ARM64\Debug\Package\bin\AndroidManifest.xml \
diff --git a/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/Package/libs/arm64-v8a/libmain.so b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/Package/libs/arm64-v8a/libmain.so
new file mode 100644
index 000000000..9281b60b7
Binary files /dev/null and b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/Package/libs/arm64-v8a/libmain.so differ
diff --git a/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/raylib_android.Packaging.androidproj.AssemblyReference.cache b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/raylib_android.Packaging.androidproj.AssemblyReference.cache
new file mode 100644
index 000000000..f5e894aea
Binary files /dev/null and b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/raylib_android.Packaging.androidproj.AssemblyReference.cache differ
diff --git a/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/raylib_android.Packaging.androidproj.FileListAbsolute.txt b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/raylib_android.Packaging.androidproj.FileListAbsolute.txt
new file mode 100644
index 000000000..ca8849922
--- /dev/null
+++ b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/raylib_android.Packaging.androidproj.FileListAbsolute.txt
@@ -0,0 +1,7 @@
+C:\raylib-master\projects\VS2019-Android\raylib_android\raylib_android\raylib_android.Packaging\ARM64\Debug\raylib_android.Packaging.androidproj.AssemblyReference.cache
+C:\raylib-master\projects\VS2019-Android\raylib_android\raylib_android\raylib_android.Packaging\ARM64\Debug\raylib_android.apk.recipe
+C:\raylib-master\projects\VS2019-Android\raylib_android\raylib_android\raylib_android.Packaging\ARM64\Debug\raylib_android.apk.recipe.merged
+C:\raylib-master\projects\VS2019-Android\raylib_android\raylib_android\raylib_android.Packaging\ARM64\Debug\Package\libs\arm64-v8a\libmain.so
+C:\raylib-master\projects\VS2019-Android\raylib_android\raylib_android\raylib_android.Packaging\ARM64\Debug\FileStringReplace.incremental
+C:\raylib-master\projects\VS2019-Android\raylib_android\raylib_android\raylib_android.Packaging\ARM64\Debug\raylib_android.apk
+C:\raylib-master\projects\VS2019-Android\raylib_android\raylib_android\raylib_android.Packaging\ARM64\Debug\raylib_android.lastsuccessfuldeploy
diff --git a/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/raylib_android.apk b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/raylib_android.apk
new file mode 100644
index 000000000..93e25ff1d
Binary files /dev/null and b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/raylib_android.apk differ
diff --git a/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/raylib_android.apk.recipe b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/raylib_android.apk.recipe
new file mode 100644
index 000000000..df0247cf4
--- /dev/null
+++ b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/raylib_android.apk.recipe
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+ C:\raylib-master\projects\VS2019-Android\raylib_android\ARM64\Debug\libmain.so.recipe
+
\ No newline at end of file
diff --git a/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/raylib_android.apk.recipe.merged b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/raylib_android.apk.recipe.merged
new file mode 100644
index 000000000..4fa647c95
--- /dev/null
+++ b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/raylib_android.apk.recipe.merged
@@ -0,0 +1,9 @@
+
+
+ C:\raylib-master\projects\VS2019-Android\raylib_android\ARM64\Debug\libmain.so;C:\Users\VadimPC\AppData\Local\Android\Sdk\ndk\21.1.6352462\prebuilt\android-arm64\gdbserver\gdbserver;C:\Users\VadimPC\AppData\Local\Android\Sdk\ndk\21.1.6352462\sources\cxx-stl\llvm-libc++\libs\arm64-v8a\libc++_static.a;C:\Users\VadimPC\AppData\Local\Android\Sdk\ndk\21.1.6352462\sources\cxx-stl\llvm-libc++\libs\arm64-v8a\libc++abi.a
+
+ C:\raylib-master\projects\VS2019-Android\raylib_android\raylib_android\raylib_android.NativeActivity\ARM64\Debug
+ Debug
+ ARM64
+ arm64-v8a
+
\ No newline at end of file
diff --git a/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/raylib_android.lastsuccessfuldeploy b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/raylib_android.lastsuccessfuldeploy
new file mode 100644
index 000000000..6e3de1137
--- /dev/null
+++ b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/ARM64/Debug/raylib_android.lastsuccessfuldeploy
@@ -0,0 +1,5 @@
+
+
+ F9A6A85E3E5B97597FDA71530354AAB661E14734423F733955142BB056D5924A
+ 2021-09-23 15:30:04
+
\ No newline at end of file
diff --git a/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/AndroidManifest.xml b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/AndroidManifest.xml
new file mode 100644
index 000000000..8d58d3756
--- /dev/null
+++ b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/AndroidManifest.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/build.xml b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/build.xml
new file mode 100644
index 000000000..4dd78480d
--- /dev/null
+++ b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/build.xml
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/project.properties b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/project.properties
new file mode 100644
index 000000000..3c100376c
--- /dev/null
+++ b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/project.properties
@@ -0,0 +1,3 @@
+# Project target
+target=$(androidapilevel)
+# Provide path to the directory where prebuilt external jar files are by setting jar.libs.dir=
diff --git a/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/raylib_android.Packaging.androidproj b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/raylib_android.Packaging.androidproj
new file mode 100644
index 000000000..030d71747
--- /dev/null
+++ b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/raylib_android.Packaging.androidproj
@@ -0,0 +1,134 @@
+
+
+
+
+ Debug
+ ARM
+
+
+ Release
+ ARM
+
+
+ Debug
+ ARM64
+
+
+ Release
+ ARM64
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+ Debug
+ x86
+
+
+ Release
+ x86
+
+
+
+ raylib_android
+ 14.0
+ 1.0
+ {b2231f0d-52da-4c55-8998-5886f766553c}
+
+
+
+ true
+ Application
+
+
+ false
+ Application
+
+
+ true
+ Application
+
+
+ false
+ Application
+
+
+ true
+ Application
+
+
+ false
+ Application
+
+
+ true
+ Application
+
+
+ false
+ Application
+
+
+
+
+
+
+
+
+ $(RootNamespace)
+
+
+
+
+ $(RootNamespace)
+
+
+
+
+ $(RootNamespace)
+
+
+
+
+ $(RootNamespace)
+
+
+
+
+ $(RootNamespace)
+
+
+
+
+ $(RootNamespace)
+
+
+
+
+ $(RootNamespace)
+
+
+
+
+ $(RootNamespace)
+
+
+
+
+
+
+
+
+
+
+ {bfb31759-4fca-4503-bc7c-a97f705efdb2}
+
+
+
+
+
\ No newline at end of file
diff --git a/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/res/values/strings.xml b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/res/values/strings.xml
new file mode 100644
index 000000000..98afc4675
--- /dev/null
+++ b/projects/VS2019-Android/raylib_android/raylib_android/raylib_android.Packaging/res/values/strings.xml
@@ -0,0 +1,4 @@
+
+
+ raylib_android.Packaging
+