Covellite++
Version: 2.3.2 Revision: 2584 Platform: x64 Build: 19:03 05.09.2026
Кроссплатформенный фреймворк для разработки приложений на С++
Toggle main menu visibility
Загрузка...
Поиск...
Не найдено
Application.android.cpp
1
2
#include "stdafx.h"
3
#include <Covellite/App/Application.hpp>
4
#include <Covellite/Events.hpp>
5
#include <Covellite/App/Events.hpp>
6
7
using
AppInfo_t = ::alicorn::system::platform::AppInfo;
8
9
using namespace
covellite::app;
10
11
class
Logcat
12
{
13
public
:
14
inline
static
void
Error(
const
char
* _Format, ...)
15
{
16
va_list Args;
17
va_start(Args, _Format);
18
(void)__android_log_print(ANDROID_LOG_ERROR,
"Covellite++"
, _Format, Args);
19
va_end(Args);
20
}
21
22
inline
static
void
Info(
const
char
* _Format, ...)
23
{
24
va_list Args;
25
va_start(Args, _Format);
26
(void)__android_log_print(ANDROID_LOG_INFO,
"Covellite++"
, _Format, Args);
27
va_end(Args);
28
}
29
};
30
35
Application::Application
(
const
Run_t & _Run) :
36
Run
(_Run)
37
{
38
auto
& App = AppInfo_t::Get<android_app>();
39
40
App.userData =
this
;
41
App.onAppCmd = [](
android_app
* _pApp, int32_t _Message)
42
{
43
if
(_pApp ==
nullptr
|| _pApp->userData ==
nullptr
)
return
;
44
45
// cppcheck-suppress constVariable
46
auto
& Events = *(
reinterpret_cast<
Application
*
>
(_pApp->userData));
47
48
Events.m_Events[_Message]();
49
};
50
51
App.onInputEvent = [](
android_app
* _pApp, AInputEvent * _pEvent) -> int32_t
52
{
53
if
(_pApp ==
nullptr
|| _pApp->userData ==
nullptr
)
return
0;
54
55
// cppcheck-suppress constVariable
56
auto
& Events = *(
reinterpret_cast<
Application
*
>
(_pApp->userData));
57
58
const
auto
EventType = AInputEvent_getType(_pEvent);
59
const
auto
ActionType = AMotionEvent_getAction(_pEvent);
60
61
const
auto
IsSuccess = Events.m_Events[(EventType << 8) | ActionType](_pEvent);
62
return
(IsSuccess) ? 1 : 0;
63
};
64
65
m_Events[(int32_t)APP_CMD_INIT_WINDOW]
66
.Connect([=]() { m_Events[events::Application.Start](); });
67
m_Events[(int32_t)APP_CMD_STOP]
68
.Connect([=]() { m_Events[events::Application.Exit](); });
69
m_Events[(int32_t)APP_CMD_TERM_WINDOW]
70
.Connect([=]()
71
{
72
// Простую очистку стека здесь делать нельзя, т.к. реализация std::stack
73
// в CrystaX удаляет объекты стека в порядке их создания (в отличие от
74
// реализации от Microsoft, которая удаляет их в обратном порядке).
75
//m_Windows = Windows_t{};
76
77
while
(!m_Windows.empty()) m_Windows.pop();
78
});
79
m_Events[events::Application.Exit]
80
.Connect([=]() { ANativeActivity_finish(App.activity); });
81
}
82
88
Application::Application
(
Continuous
) :
89
Application
([=](void)
90
{
91
auto
& DestroyRequested = AppInfo_t::Get<android_app>().destroyRequested;
92
93
m_IsFocused =
true
;
94
95
while
(DestroyRequested == 0)
96
{
97
if
(m_IsFocused)
98
{
99
// Выбирает все события, которые есть в очереди событий, не ожидая
100
// появлений новых.
101
while
(
PostCommand
(
false
)) {}
102
}
103
else
104
{
105
// Ждем появления события (использовать while здесь нельзя, т.к.
106
// эта функция, вызванная с параметром true, не может вернуть false
107
// ни при каких условиях! Это не проблема во время работы, но при
108
// завершении работы программы это приводит к бесконечному циклу.)
109
PostCommand
(
true
);
110
}
111
112
m_Events[events::Application.Update]();
113
}
114
})
115
{
116
// Обслуживание отключения непрерывной отрисовки экрана при потере фокуса
117
// программой.
118
m_Events[(int32_t)APP_CMD_LOST_FOCUS]
119
.Connect([=]() { m_IsFocused =
false
; });
120
m_Events[(int32_t)APP_CMD_GAINED_FOCUS]
121
.Connect([=]() { m_IsFocused =
true
; });
122
}
123
129
Application::Application
(
EventBased
) :
130
Application
([=](void)
131
{
132
auto
& DestroyRequested = AppInfo_t::Get<android_app>().destroyRequested;
133
134
Logcat::Info(
"Application::Run(): event based circle started."
);
135
136
while
(DestroyRequested == 0)
137
{
138
PostCommand
(
true
);
139
m_Events[events::Application.Update]();
140
}
141
})
142
{
143
}
144
145
/*virtual*/
Application::~Application(
void
)
noexcept
146
{
147
auto
& App = AppInfo_t::Get<android_app>();
148
149
App.onAppCmd =
nullptr
;
150
App.onInputEvent =
nullptr
;
151
App.userData =
nullptr
;
152
}
153
165
/*static*/
void
Application::Main
(CreateApp_t _fnCreateApp,
void
* _pParams)
noexcept
166
{
167
// Использование логгера Android напрямую, т.к. логгер Alicorn здесь еще
168
// не инициализирован.
169
Logcat::Info(
"Application::Main(): start program."
);
170
171
try
172
{
173
auto
* pApp =
reinterpret_cast<
android_app
*
>
(_pParams);
174
175
Logcat::Info(
"Application::Main(): init."
);
176
177
// При переходе на Clang:
178
// - Для pApp->window код не компилируется.
179
// - Для &pApp->window вызов AppInfo_t::Get<ANativeWindow *>() бросает
180
// исключение для несуществующего значения.
181
const
AppInfo_t Info
182
{
183
pApp,
184
pApp->activity,
185
pApp->activity->vm,
186
};
187
188
Logcat::Info(
"Application::Main(): create app object."
);
189
190
const
auto
pApplication = _fnCreateApp();
191
192
Logcat::Info(
"Application::Main(): run program."
);
193
194
pApplication->Run();
195
}
196
catch
(const ::std::exception & _Ex)
197
{
198
Logcat::Error(
"Application::Main(): error [%s]."
, _Ex.what());
199
}
200
catch
(...)
201
{
202
Logcat::Error(
"Application::Main(): error [unknown]."
);
203
}
204
205
Logcat::Info(
"Application::Main(): finish program."
);
206
}
207
212
::std::string
Application::GetCommandLine
(
void
)
const
213
{
214
return
""
;
215
}
216
233
bool
Application::PostCommand
(
bool
_IsWaitMessage)
234
{
235
android_poll_source
* pSource =
nullptr
;
236
237
const
auto
Result = ALooper_pollAll((_IsWaitMessage) ? -1 : 0,
238
nullptr
,
nullptr
, (
void
**)&pSource);
239
if
(Result < 0 || pSource ==
nullptr
)
return
false
;
240
241
pSource->process(&AppInfo_t::Get<android_app>(), pSource);
242
243
return
true
;
244
}
android_poll_source
Определения
android_native_app_glue.h:90
android_app
Определения
android_native_app_glue.h:111
covellite::app::Application::Application
Application(const Run_t &)
Инициализирующий конструктор класса.
Определения
Application.android.cpp:35
covellite::app::Application::Main
static void Main(void *) noexcept
Функция точки входа в программу.
Определения
Application.inl:58
covellite::app::Application::Run
const Run_t Run
Объект функции запуска главного цикла программы.
Определения
Application.hpp:71
covellite::app::Application::PostCommand
VIRTUAL_MOCK bool PostCommand(bool)
Функция вызова сигнала произошедшего события..
Определения
Application.android.cpp:233
covellite::app::Application::GetCommandLine
::std::string GetCommandLine(void) const
Функция получения параметров командной строки, которые были переданы программе ее при запуске.
Определения
Application.android.cpp:212
covellite::app::Application::Continuous
Непрерывная отрисовка экрана (режим работы игры).
Определения
Application.hpp:57
covellite::app::Application::EventBased
Определения
Application.hpp:58
Solution
Solution
Covellite.App
Covellite.App
Application.android.cpp
Документация по Covellite++. Последние изменения:
. Создано системой
1.18.0