2014-02-16 115 views
5

我正在學習emscripten,在C++和JS之間傳遞字符串時,我甚至無法獲得最基本的字符串操作。如何通過emscripten在C++和javascript之間傳遞字符串

例如,我想寫一個字符串長度函數。在C++:

extern "C" int stringLen(std::string p) 
{ 
    return p.length(); 
} 

從JavaScript調用如:

var len = _stringLen("hi."); 

這就產生0我。我如何按預期完成這項工作?我應該在這裏使用哪種字符串類型? char const*std::wstringstd::string?似乎沒有工作;我總是得到非常隨機的值。

這只是一個開始...然後我怎麼返回這樣的C++字符串呢?

extern "C" char *stringTest() 
{ 
    return "..."; 
} 

而且在JS:

var str = _stringTest(); 

同樣,我不能找到一種方法,使這項工作;我總是在JS中得到垃圾。

所以我的問題很清楚:我如何通過Emscripten封裝JS和C++之間的字符串類型?

回答

0

的一點想法:

  1. 我稱之爲一個方法的唯一方法是使用crwapccall
    var length = Module.ccall('stringLen', ['string'], 'number');
  2. 您是否在EXPORTED_FUNCTIONS參數中包含stringLenstringTest
    emcc hello_world.cpp ... -s EXPORTED_FUNCTIONS=['_stringLen','_stringTest']

看看此處瞭解詳情:
http://kripken.github.io/emscripten-site/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.html

還是我的程序hello_world教程:
http://www.brightdigit.com/hello-emscripten/

希望幫助。

6

extern「C」無法識別std :: string。

你可以試試這個:
Test.cpp的

#include <emscripten.h> 
#include <string.h> 

extern "C" int stringLen(char* p) 
     { 
      return strlen(p); 
     } 

使用下面的命令編譯代碼CPP:

emcc Test.cpp -s EXPORTED_FUNCTIONS="['_stringLen'] 

樣品測試代碼:
的test.html

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
     <meta charset="utf-8"> 
     <title>Hello World !</title> 
     <script src="a.out.js"></script> 
     <script> 
      var strLenFunction = Module.cwrap('stringLen', 'number', ['string']); 
      var len1 = strLenFunction("hi."); // alerts 3 
      alert(len1); 
      var len2 = strLenFunction("Hello World"); // alerts 11 
      alert(len2); 
     </script> 
    </head> 
</html> 
2

如果將extern「C」與函數一起使用,則不能在其簽名中使用C++類型。

所以如果你想使用std :: string,那麼你可以使用「Embind」或「WebIDL Binder」。參考here

我更喜歡embind,所以這是你的問題的示例代碼。

P.S我不知道如何在這裏通過引用傳遞變量,所以這樣做的價值。

// This is your routine C++ code 
size_t MyStrLen(std::string inStr) { 
    return inStr.length(); 
} 

// This is the extra code you need to write to expose your function to JS 
EMSCRIPTEN_BINDINGS(my_module) { 
    function("MyStrLen", &MyStrLen); 
} 

現在JS所有你需要做的是:

var myStr = "TestString"; 
Module.MyStrLen(myStr); 

確保您通過標誌

--bind

調用EMCC時。

another approach你可以在JS的C++堆上做一個Malloc然後做操作,但上面的方法應該更容易。

相關問題