As far as I understand one has two options to port a C program to Native Client:

  1. Implement a number of initializing functions like PPP_InitializeModule and PPP_GetInterface.
  2. Simply pass your main function to PPAPI_SIMPLE_REGISTER_MAIN.

So the question is how can I implement JS message handling (handle messages emitted by JS code in native code) in the second case?

有帮助吗?

解决方案

Take a look at some of the examples in the SDK in examples/demo directory: earth, voronoi, flock, pi_generator, and life all use ppapi_simple.

Here's basically how it works:

When using ppapi_simple, all events (e.g. input events, messages from JavaScript) are added to an event queue. The following code is from the life example (though some of it is modified and untested):

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 then determines what kind of event it is, and handles it in an application specific way:

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.
   }
}

To send messages back to JavaScript, use the PostMessage function on the messaging interface:

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);

You can send and receive other JavaScript types too: ints, floats, arrays, array buffers, and dictionaries. See also PPB_VarArray, PPB_VarArrayBuffer and PPB_VarDictionary interfaces.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top