Can't get NaCl C++ module to load file from within packaged app

≯℡__Kan透↙ 提交于 2019-12-04 08:18:20

From Sam Clegg on the native-client-discuss list:

"I think the main problem you have is that you are trying to use nacl_io on the main thread. nacl_io, like the blocking PPAPI interfaces on which it is mostly based, will only work on background threads where blocking calls are allowed. See: https://developer.chrome.com/native-client/devguide/coding/nacl_io."

"Try running your code on a separate thread. One easy way to do this is to use the ppapi_simple library."

Using this advice, and also looking at the examples using_ppapi_simple, flock, and earth, that are included with the SDK, I was able to make a working version:

file_test.cc

#include <stdio.h>
#include "sys/mount.h"

#include <ppapi/cpp/var.h>
#include "ppapi_simple/ps_main.h"
#include "ppapi_simple/ps_event.h"
#include "ppapi_simple/ps_interface.h"


int file_test_main(int argc, char* argv[]) {
    PSEventSetFilter(PSE_ALL);

    // mount the http root at /http
    mount("", "/http", "httpfs", 0, "");

    while (true) {
        PSEvent* ps_event;
        // Consume all available events
        while ((ps_event = PSEventWaitAcquire()) != NULL) {
            // handle messages from javascript
            if (ps_event->type == PSE_INSTANCE_HANDLEMESSAGE) {
                // Convert Pepper Simple message to PPAPI C++ vars
                pp::Var var_message(ps_event->as_var);
                // process the message if it is a string
                if (var_message.is_string()) {
                    // get the string message
                    std::string message = var_message.AsString();

                    // handle message
                    if (message == "file") {
                        // Open and load from the file  
                        int c;
                        FILE *file;
                        file = fopen("/http/test.txt", "r");
                        if (file) {
                            c = getc(file);
                            fclose(file);
                        } else {
                            c = -100;
                        }

                        // Send response back to JavaScript
                        pp::Var var_reply(c);
                        PSInterfaceMessaging()->PostMessage(PSGetInstanceId(), var_reply.pp_var());
                    }
                }
            }

            PSEventRelease(ps_event);
        }
    }

    return 0;
}

/*
 * Register the function to call once the Instance Object is initialized.
 * see: pappi_simple/ps_main.h
 */
PPAPI_SIMPLE_REGISTER_MAIN(file_test_main)

In addition, it is necessary to add -lppapi_simple to LDFLAGS in Makefile.

It would also be possible to do this handling the threads oneself, rather than using ppapi_simple, which can be seen in nacl_io_demo which is included with the SDK.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!