No se puede obtener el módulo NaCl C ++ para cargar el archivo desde la aplicación empaquetada

Tengo una aplicación empaquetada de Chrome que también incluye un módulo PNaCl / NaCl C ++, así como algunos archivos de datos que el módulo NaCl necesita leer. Sin embargo, no puedo hacer que se lea en los archivos.

Lo configuré de acuerdo con toda la documentación y ejemplos oficiales que pude encontrar, así como la respuesta a:Cómo incluir un archivo de datos en una aplicación de Chrome para que lo lea un módulo de cliente nativo

La demostración nacl_io que viene con el SDK puede hacer esto, pero está en C, no en C ++.

Se me ocurrió un ejemplo simple, que publicaré a continuación. Cuando presiona el botón en la página, el módulo NaCl debe cargar el primer carácter de test.txt y mostrarlo. A partir de ahora, siempre responde con "-100" (el valor de error que puse), lo que significa que no pudo abrir el archivo, en lugar de con el primer carácter del archivo.

¿Alguien puede sugerir algunos cambios que le permitan funcionar correctamente y cargar el archivo?

Para ejecutarlo, al menos en Mac, utilizo este comando, con todos los archivos en el ./file-test dir: / Applications / Google \ Chrome.app/Contents/MacOS/Google \ Chrome --load- and-launch-app =. / file-test

Tenga en cuenta que si intenta usar esto, lo más probable es que necesite cambiar la ruta NACL_SDK_ROOT en el archivo MAKE.

file_test.cc
#include "ppapi/cpp/instance.h"
#include "ppapi/cpp/module.h"
#include "ppapi/cpp/var.h"

#include "nacl_io/nacl_io.h"
#include "sys/mount.h"

class FileTestInstance : public pp::Instance {
 public:
  explicit FileTestInstance(PP_Instance instance) : pp::Instance(instance)
  {
    // initialize nacl file system
    nacl_io_init_ppapi(instance, pp::Module::Get()->get_browser_interface());

    // mount the http root at /http
    mount("", "/http", "httpfs", 0, "");
  }
  virtual ~FileTestInstance() {}

  // Receive message from javascript
  virtual void HandleMessage(const pp::Var& var_message) {
    // 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 message to JavaScript
    pp::Var var_reply(c);
    PostMessage(var_reply);
  }
};

class FileTestModule : public pp::Module {
 public:
  FileTestModule() : pp::Module() {}
  virtual ~FileTestModule() {}

  virtual pp::Instance* CreateInstance(PP_Instance instance) {
    return new FileTestInstance(instance);
  }
};

namespace pp {
Module* CreateModule() {
  return new FileTestModule();
}
}  // namespace pp
index.html
<!DOCTYPE html>
<html>
<head>
  <title>File Test</title>
 <script type="text/javascript" src="script.js"></script>
</head>
<body>

  <h1>File Test</h1>

  <input type="button" id="test" name="test" value="Test" />

  <p><b>Output:</b><p>
  <div id="output">
  </div>

  <p>
    <div id="listener">
      <embed id="file_test" width=0 height=0 src="file_test.nmf" type="application/x-pnacl" />
    </div>
  </p>
</body>
</html>
script.js
// outgoing messages
function postMessage(message) {
 var nacl_module = document.getElementById('file_test')
 nacl_module.postMessage(message);
}

// incoming messages
function handleMessage(message_event) {
  var outputDiv = document.getElementById('output');
  outputDiv.textContent = message_event.data;
}

// button action
function buttonClicked() {
    postMessage("file");
}

// set up
function init() {
    // add listener to nacl module
    var listener = document.getElementById('listener');
    listener.addEventListener('message', handleMessage, true);

    // add action to button
    document.getElementById("test").onclick = buttonClicked;
}

window.onload = init;
main.js
/**
 * Listens for the app launching then creates the window
 */
chrome.app.runtime.onLaunched.addListener(function() {
  // Center window on screen.
  var screenWidth = screen.availWidth;
  var screenHeight = screen.availHeight;
  var width = 600;
  var height = 600;

  chrome.app.window.create('index.html', {
    id: "File-TestID",
    bounds: {
      width: width,
      height: height,
      left: Math.round((screenWidth-width)/2),
      top: Math.round((screenHeight-height)/2)
    }
  });
});
file_test.nmf
{
  "program": {
    "portable": {
      "pnacl-translate": {
        "url": "file_test.pexe"
      }
    }
  }
}
Makefile
#
# Get pepper directory for toolchain and includes.
#
# If NACL_SDK_ROOT is not set, then assume where it can be found.
#
THIS_MAKEFILE := $(abspath $(lastword $(MAKEFILE_LIST)))
NACL_SDK_ROOT ?= $(abspath $(dir $(THIS_MAKEFILE))../../nacl_sdk/pepper_33)

# Project Build flags
WARNINGS := -Wno-long-long -Wall -Wswitch-enum -pedantic -Werror
CXXFLAGS := -pthread -std=gnu++98 $(WARNINGS)

#
# Compute tool paths
#
GETOS := python $(NACL_SDK_ROOT)/tools/getos.py
OSHELPERS = python $(NACL_SDK_ROOT)/tools/oshelpers.py
OSNAME := $(shell $(GETOS))
RM := $(OSHELPERS) rm

PNACL_TC_PATH := $(abspath $(NACL_SDK_ROOT)/toolchain/$(OSNAME)_pnacl)
PNACL_CXX := $(PNACL_TC_PATH)/bin/pnacl-clang++
PNACL_FINALIZE := $(PNACL_TC_PATH)/bin/pnacl-finalize
CXXFLAGS := -I$(NACL_SDK_ROOT)/include -I$(NACL_SDK_ROOT)/include/pnacl
LDFLAGS := -L$(NACL_SDK_ROOT)/lib/pnacl/Release -lppapi_cpp -lppapi -lnacl_io

#
# Disable DOS PATH warning when using Cygwin based tools Windows
#
CYGWIN ?= nodosfilewarning
export CYGWIN


# Declare the ALL target first, to make the 'all' target the default build
all: file_test.pexe

clean:
    $(RM) file_test.pexe file_test.bc

file_test.bc: file_test.cc
    $(PNACL_CXX) -o $@ $< -O2 $(CXXFLAGS) $(LDFLAGS)

file_test.pexe: file_test.bc
    $(PNACL_FINALIZE) -o $@ $<
test.txt
AAAA