我正在使用Kotlin在我的Android应用程序中使用Duktape成功解析和评估javascript文件.
val file_name = "lib.js"
val js_string = application.assets.open(file_name).bufferedReader().use {
it.readText()
}
val duktape = Duktape.create()
try {
Log.d("Greeting", duktape.evaluate("'hello world'.toUpperCase();").toString())
duktape.evaluate(js_string)
} finally {
duktape.close()
}
Run Code Online (Sandbox Code Playgroud)
javascript文件是使用Browserify创建的,因此它是一个包含所有内容的单个文件,并且工作正常.但是我需要从模块中请求一个模块和一个方法,例如:
var test = require('testjs-lib');
test.EVPair.makeRandom().toWTF();
Run Code Online (Sandbox Code Playgroud)
除了这个链接,我不知道怎么做,也没有找到任何例子:http://wiki.duktape.org/HowtoModules.html
它告诉我使用modsearch,但我不知道如何做到或应该放在哪里,即使它适用于Duktape Android(https://github.com/square/duktape-) android).
有没有人成功地做过这件事可以解释一下这个问题?
说我有一个c ++类Point
class Point {
public:
Point();
Point(float x, float y);
~Point();
float X;
float Y;
};
Run Code Online (Sandbox Code Playgroud)
我想添加javascript功能并选择duktape.
是否可以在JavaScript中重用此类?说
var p = new Point(1.23, 4.56);
Run Code Online (Sandbox Code Playgroud)
我一直在阅读duktape文档,它只说如何重用javascript中的函数.
我在另一个程序中嵌入了一个非常简单的 duktape 插件。简单的东西有效,但我不确定如何发出 HTTP 请求。甚至可以从 Duktape VM 内发出 HTTP 请求吗?
所以我有这个 duktape 函数,它接受一个对象作为参数之一。在正常情况下,要检索每个对象属性的值,我会使用duk_get_prop()and duk_push_string(),但是这假设我事先知道我得到的对象的结构。
现在,考虑一个接受结构未知的对象的函数。我需要迭代它的键,并检索它的所有值。
我正在尝试将这样的对象转换为 C++std::map<string, string>
例如,从 Javascript 调用
myFunction({x: 1, y: 3, z: 35})应该和myFunction({foo: 12, bar: 43}).
似乎这duk_enum()将是一个合适的功能,但我不太了解它是如何工作的。
我正在使用 Duktape 嵌入 JavaScript,但使用require总是会导致错误:
int main(){
duk_context *ctx = duk_create_heap_default();
duk_peval_file(ctx, "example.js");
printf("file load err %s", duk_safe_to_string(ctx, -1));
duk_destroy_heap(ctx);
}
Run Code Online (Sandbox Code Playgroud)
例子.js
var mylib = require("mylib")
print (mylib.hello)
Run Code Online (Sandbox Code Playgroud)
mylib.js
exports.hello = "Hello"
Run Code Online (Sandbox Code Playgroud)
错误:
文件加载错误类型错误:不可调用
堆栈转储 说:
duk_js_call.c:682
需要本机严格的preventyield
eval example.js:1 preventyield
使用duktape javascript实现,您可以将本机C函数公开给javascript并实现它们,如下所示:
static duk_ret_t native_prime_check(duk_context *ctx) {
int arg1 = duk_require_int(ctx, 0);
int arg2 = duk_require_int(ctx, 1);
// do something.
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在公开本机函数时,我们需要指定参数的数量.
duk_push_c_function(ctx, native_prime_check, 2 /*nargs*/);
Run Code Online (Sandbox Code Playgroud)
请举例说明如何创建一个C函数,该函数接受可变数量的参数并使用duktape将其公开给Javascript.
我今天刚开始在我的C++框架中使用Duktape,我已经阅读了整个api而无法理解我如何捕获错误.我找到了一些关于放在堆栈上的错误对象的线索但是,每次出现错误时(例如无效的javascript语法),一切都变得疯狂,我得到了一个SEGFAULT.
我目前正在使用duk_eval函数评估一些js行
这是我的代码行:
duk_push_string(ctx,"pouet");
duk_eval(ctx);
Run Code Online (Sandbox Code Playgroud)
ctx 是您在创建duktape堆时提供的基本上下文
使用try-catch不会捕获任何东西
任何的想法?
提前致谢
我有以下Postgres查询:
db.queryAsync('SELECT _id, value FROM ' + store + ' WHERE (value->>$1)=$2;', [index, id]);
Run Code Online (Sandbox Code Playgroud)
我想在SQLite中写相同的内容.我已将值字段创建为TEXT类型,但后来不确定如何查询.我正在使用在Duktape上运行的SQLite和JavaScript.