2016-05-12 23 views
0

我有一个最小的应用程序使用果酱核心。它创建一个webview,然后发送数据以使用s3eSecureStoragePut & s3eSecureStorageGet进行存储和检索。Marmalade核心存储(s3eSecureStoragePut&s3eSecureStorageGet)不会持续

这工作正常,直到我关闭应用程序并重新打开它。再次加载后,我尝试加载它返回的数据为空白。有没有人有任何想法,为什么这可能会发生?它内置/部署使用GCC ARM调试为Android

这里是我的C++

#include "s3e.h" 
#include "s3eDevice.h" 
#include "IwDebug.h" 
#include "s3eWebView.h" 
#include "IwGx.h" 
#include "Iw2D.h" 
#include <string> 
#include <sstream> 

s3eWebView* webView; 
bool pageLoaded; 
const char* rom = "rom://index.html"; 

struct SStoreData { 
    std::string key; 
}; 

static int loadedCallback(s3eWebView* instance, void* sysData, void* userData) { 
    pageLoaded = true; 
    return 1; 
} 

static int javaScriptCallback(s3eWebView* instance, void* systemData, void* userData) { 
//cast the data to string for easier handling 
std::string data = (char*) systemData; 
char jsFunc[128]; 
//check if page has loaded to prevent errors 
if (pageLoaded) { 
    if (!std::strncmp(data.c_str(), "saveKey", std::strlen("saveKey"))) { 
     std::string key = data.substr(data.find("|") + 1, data.length()); 
     SStoreData *toSave = new SStoreData; 
     toSave->key = key; 
     s3eSecureStoragePut (toSave, sizeof (*toSave)); 
    } else if ("loadKey" == data) { 
     SStoreData *toLoad = new SStoreData; 
     s3eSecureStorageGet (toLoad,sizeof(*toLoad)); 
     sprintf(jsFunc, "dataLoaded(\"%s\", \"key\");", toLoad->key.c_str()); 
     s3eWebViewSendJavaScript(webView, jsFunc); 
    } else { 

     IwTrace(JS_CALLBACK, ("DID NOT RECEIVE ANYTHING")); 
    } 
} 
return 1; 
} 


void init() { 
//init vars 
webView = s3eWebViewCreate(false); 
pageLoaded = false; 

//register callbacks 
s3eWebViewRegister(S3E_WEBVIEW_FINISHED_LOADING, loadedCallback, NULL, webView); 
s3eWebViewRegister(S3E_WEBVIEW_FROM_JAVASCRIPT, javaScriptCallback, NULL, webView); 

//navigate to the webpage 
s3eWebViewNavigate(webView, rom); 
//display the webview 
s3eWebViewShow(webView, 0, 0, IwGxGetDisplayWidth(), IwGxGetDisplayHeight()); 
} 

void destroy() { 
if (webView) { 
    s3eWebViewDestroy(webView); 
    webView = NULL; 

    //unregister callbacks 
    s3eWebViewUnRegister(S3E_WEBVIEW_FINISHED_LOADING, loadedCallback, webView); 
    s3eWebViewUnRegister(S3E_WEBVIEW_FROM_JAVASCRIPT, javaScriptCallback, webView); 
} 
delete rom; 

//gives me warning so I'm leaving it out. 
//delete pipHandler; 
} 

// Main entry point for the application 
int main() 
{ 
    //Initialise graphics system(s) 
    //Initialise graphics system(s) 
    Iw2DInit(); 

    //Init 
    init(); 

    // Loop forever, until the user or the OS performs some action to quit the app 
    while (!s3eDeviceCheckQuitRequest()) { 
     //Update the input systems 
     s3eKeyboardUpdate(); 
     s3ePointerUpdate(); 


    // Your rendering/app code goes here. 


    // Sleep for 0ms to allow the OS to process events etc. 
     s3eDeviceYield(0); 
    } 

    destroy(); 

    //Terminate modules being used 

    // Return 
    return 0; 
} 

,这里是对的WebView的HTML/JS

<!DOCTYPE html> 
<html> 
<head> 
    <title>Storage Spike</title> 
</head> 
<body onload="main();"> 
    <div>Loaded value:<span id="loadedKey">(loaded value goes here)</span></div> 
    <input type="text" id="inputKey" value="123key" placeholder="enter key to save"/> 
    <button id="saveKey">Save</button> 
    <button id="loadKey">Load</button> 
    <br> 
    <script> 
    function main() 
    { 
     var saveKey = document.getElementById("saveKey"); 
     var loadKey = document.getElementById("loadKey"); 
     var inputKey = document.getElementById("inputKey"); 

     saveKey.addEventListener("click", function() { 
     var key = inputKey.value; 
     s3e.exec("saveKey|" + key); 
     }); 

     loadKey.addEventListener("click", function() { 
     s3e.exec("loadKey"); 
     }); 

    } 

    function dataLoaded(data, type) 
    { 
     console.log(data); 
     console.log(type); 
     var loadedKey = document.getElementById("loadedKey"); 
     if(type === "key") 
     loadedKey.innerHTML = data; 
     else 
     console.log("type error"); 
    } 

    </script> 
</body> 
</html> 

任何帮助将不胜感激,

亲切的问候

回答

0

问题是,你正试图直接保存std :: string的一个实例。

一个std :: string实例不过是三个指针,它们描述了它用于存储实际字符串数据的内存。当应用程序关闭或用于存储数据的内存被释放时,这些指针将失去所有含义。

您需要将实际的字符串数据保存到s3eSecureStorage以使其保留。为此,您需要序列化std :: string实例。进行序列化的一种简单方法是首先保存字符串的长度,然后保存实际的字符串数据。

序列化和保存字符串s3eSecureStorage,你可以这样做:

std::string input = "exampledata"; 
uint16 inputSize = static_cast<uint16>(input.size()); 
uint16 bufferSize = static_cast<uint16>(sizeof(uint16) + inputSize); 
buffer = new char[bufferSize]; 
std::memcpy(buffer, &inputSize, sizeof(uint16)); 
std::memcpy(buffer + sizeof(uint16), input.c_str(), inputSize); 
s3eSecureStoragePut(buffer, bufferSize); 
delete[] buffer; 

而且摆脱s3eSecureStorage数据和反序列化的字符串,你可以这样做:

std::string output; 
uint16 dataSize = 0; 
s3eSecureStorageGet(&dataSize, sizeof(uint16)); 
if (dataSize > 0) { 
    uint16 bufferSize = static_cast<uint16>(dataSize + sizeof(uint16)); 
    char* buffer = new char[bufferSize]; 
    s3eSecureStorageGet(buffer, bufferSize); 
    output.resize(dataSize); 
    std::memcpy(&output[0], buffer + sizeof(uint16), dataSize); 
    delete[] buffer; 
} 

如果你想存储多个值,序列化需要稍微复杂一点,但基本思想是一样的。

很显然,当没有任何东西保存到s3eSecureStorage时,您还需要使用某种错误处理。

您发布的代码在您的应用程序的单次执行过程中工作的原因是因为您分配了SStoreData实例新的并且从未发布它。当你从s3eSecureStorage加载指针时,它们仍然指向保存字符串数据的分配内存。