Не удается получить модуль NaCl C ++ для загрузки файла из упакованного приложения

У меня есть приложение, упакованное в Chrome, которое также включает в себя модуль PNaCl / NaCl C ++, а также некоторые файлы данных, которые нужно прочитать в модуле NaCl. Однако я не могу заставить его читать эти файлы.

Я настроил его в соответствии со всей документацией и официальными примерами, которые я смог найти, а также с ответом на:Как включить файл данных в приложение Chrome для чтения собственного модуля клиента

Демонстрация nacl_io, которая поставляется с SDK, способна сделать это, но она написана на C, а не на C ++.

Я придумал простой пример, который я опубликую ниже. Когда вы нажимаете кнопку на странице, модуль NaCl должен загрузить первый символ test.txt и показать его. На данный момент он всегда просто отвечает «-100» (значение ошибки, которое я ввел), что означает, что он не может открыть файл, а не с первым символом файла.

Может кто-нибудь предложить некоторые изменения, которые позволят ему правильно работать и загрузить файл?

Чтобы запустить его, по крайней мере на Mac, я использую эту команду со всеми файлами в ./file-test dir: / Applications / Google \ Chrome.app/Contents/MacOS/Google \ Chrome --load- и-запуск-приложение =. / файл-тест

Обратите внимание, что если вы попытаетесь использовать это, вам, скорее всего, потребуется изменить путь NACL_SDK_ROOT в 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 $@ 
#
# 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 $@ $<
lt; -O2 $(CXXFLAGS) $(LDFLAGS) file_test.pexe: file_test.bc $(PNACL_FINALIZE) -o $@
#
# 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 $@ $<
lt;
test.txt
AAAA

Ответы на вопрос(1)

Ваш ответ на вопрос