2016-06-24 4 views
0

Ich versuche, Javascript in Android laufen zu lassen und fand heraus Rhino und Duktape bietet die Funktionalität, ohne ein WebView zu laufen. Aber es scheint, als ob keiner von ihnen einen klaren Weg hat, eine variable Anzahl von Schlüssel-Wert-Paaren als Argument in meine js-Funktion zu übergeben. Das Argument würde wie folgt aussehen:Wie man Javascript in Android laufen lässt und in einer Karte als Argument übergibt

{"device":"android", "version":"4.4", "country":"US",...} 

und die Seite js aussehen würde wie

function calculate(param) { 
    var country = 'country'; 
    var device = 'device'; 

    if (country in param && param[country]=='US') { 
        return "a"; 
    }; 
    if (device in param && param[device]=="android") { 
        return "b"; 
    } else { 
        return "c"; 
    } 
} 

Gibt es eine Abhilfe?

Antwort

1

ich das gerade versucht, und ich erhalte die erwarteten Ergebnisse:

#include "src/duktape.h" 

char code[] = "function calculate(param) {" 
"    var country = 'country';" 
"    var device = 'device';" 
"    if (country in param && param[country]=='US') {" 
"        return \"a\";" 
"    }; " 
"    if (device in param && param[device]==\"android\") {" 
"        return \"b\";" 
"    } else {" 
"        return \"c\";" 
"    }" 
"}" 
"calculate({\"device\":\"android\", \"version\":\"4.4\", \"country\":\"US\"});"; 

int main(int argc, char *argv[]) { 
    duk_context *ctx = duk_create_heap_default(); 
    duk_eval_string(ctx, code); 
    printf("result is: %s\n", duk_get_string(ctx, -1)); 
    duk_destroy_heap(ctx); 
    return 0; 
} 

kompilieren und ausführen:

$ gcc duktest.c duktape.c -lm 
$ ./a.out 
result is: a 

Vielleicht nicht in duktape Ihr Problem ist?

+0

Ah, also was Sie getan haben ist die aufrufende Methode und params direkt in die Auswertungszeichenfolge, das ist schlau, aber wird es nicht Leistungsproblem, wenn ich mehrmals mit der gleichen Methode, aber anderen Parametern ausführen möchte? –

+0

@arthur li: Ich denke, wir nähern uns Ihrem ursprünglichen Problem. Könnte es sein, dass Sie versucht haben, Ihr param-Argument als JSON-String anstelle eines Objekts zu übergeben? – flyingfridge

1

Wenn die Eingabe eine JSON-codierte Zeichenfolge ist, dass Sie von einer anderen Stelle im Programm, können Sie es in ein zerlegte Objekt konvertieren einfach als:

duk_push_string(ctx, my_json_argument); 
duk_json_decode(ctx, -1); 

Der decodierte Wert wird auf dem Wert Stapel oben bleiben. Der Dekodierungsaufruf ist nicht "geschützt", so dass er auf ungültige Eingaben geworfen wird. Wenn dies von Bedeutung ist, sollten Sie das gesamte Argument parsen und z. in ein duk_safe_call().

Dies ist schneller (und sicherer) als eine duk_eval_string() vor allem, wenn die Eingabe nicht vollständig vertrauenswürdig ist.

Verwandte Themen