2016-05-12 5 views
0

私はマーマレード・コアを使って最小限のアプリケーションを作成しました。 Webビューを作成し、s3eSecureStoragePut & s3eSecureStorageGetを使用して、保存および取得するデータを送信します。マーマレード・コア・ストレージ(s3eSecureStoragePut&s3eSecureStorageGet)が永続しない

これは、アプリケーションを閉じてから再び開くまで問題なく動作します。それが再びロードされ、データをロードしようとすると、空白として返されます。なぜ誰かがこれが起こっているかもしれない何か考えがありますか?ここに私の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の

<!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> 

のHTML/JSのは、すべてのヘルプをいただければ幸いですアンドロイド

ためGCC ARMデバッグを使用して展開/構築され、

種類よろしく

答えて

0

問題は、あなたが直接保存しようとしているということですstd :: stringのインスタンス

std :: stringインスタンスは、実際の文字列データを格納するために使用しているメモリを表す3つのポインタに過ぎません。アプリケーションが終了するか、データの格納に使用されたメモリが解放されると、それらのポインタはすべて意味を失います。

永続化するためには、実際の文字列データを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に何も保存されていない場合には、何らかのエラー処理を使用する必要があります。

あなたのアプリケーションの1回の実行でコードが投稿されたのは、という新しいSSToreDataインスタンスをに割り当ててから解放されたためです。ポインタをs3eSecureStorageから読み込んだとき、ポインタは文字列データを保持していた割り当てられたメモリを指しています。

関連する問題