Обработка сообщений с помощью ppapi_simple
Насколько я понимаю, у одного есть два варианта портирования программы на C на Native Client:
- Реализуйте ряд инициализирующих функций, таких как
PPP_InitializeModule
а такжеPPP_GetInterface
, - Просто передайте свою основную функцию
PPAPI_SIMPLE_REGISTER_MAIN
,
Поэтому вопрос заключается в том, как я могу реализовать обработку сообщений JS (обрабатывать сообщения, отправляемые кодом JS в нативном коде) во втором случае?
1 ответ
Посмотрите на некоторые примеры из SDK в каталоге examples/demo: earth, voronoi, flock, pi_generator и life все используют ppapi_simple.
Вот в основном, как это работает:
При использовании ppapi_simple все события (например, события ввода, сообщения из JavaScript) добавляются в очередь событий. Следующий код взят из примера из жизни (хотя некоторые из них изменены и не проверены):
PSEventSetFilter(PSE_ALL);
while (true) {
PSEvent* ps_event;
/* Process all waiting events without blocking */
while ((ps_event = PSEventTryAcquire()) != NULL) {
earth.HandleEvent(ps_event);
PSEventRelease(ps_event);
}
...
}
Затем HandleEvent определяет, что это за событие, и обрабатывает его специфичным для приложения способом:
void ProcessEvent(PSEvent* ps_event) {
...
if (ps_event->type == PSE_INSTANCE_HANDLEINPUT) {
...
} else if (ps_event->type == PSE_INSTANCE_HANDLEMESSAGE) {
// ps_event->as_var is a PP_Var with the value sent from JavaScript.
// See docs for it here: https://developers.google.com/native-client/dev/pepperc/struct_p_p___var
if (ps_event->as_var->type == PP_VARTYPE_STRING) {
const char* message;
uint32_t len;
message = PSInterfaceVar()->VarToUtf8(ps_event->as_var, &len);
// Do something with the message. Note that it is NOT null-terminated.
}
}
Чтобы отправить сообщения обратно в JavaScript, используйте функцию PostMessage в интерфейсе обмена сообщениями:
PP_Var message;
message = PSInterfaceVar()->VarFromUtf8("Hello, World!", 13);
// Send a string message to JavaScript
PSInterfaceMessaging()->PostMessage(PSGetInstanceId(), message);
// Release the string resource
PSInterfaceVar()->Release(message);
Вы также можете отправлять и получать другие типы JavaScript: целые числа, числа с плавающей запятой, массивы, буферы массивов и словари. Смотрите также интерфейсы PPB_VarArray, PPB_VarArrayBuffer и PPB_VarDictionary.