我使用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()
}

javascript文件是使用Browserify创建的,因此它是一个包含所有内容的单个文件,并且工作正常。但是我需要从该模块请求一个模块和一个方法,例如:
var test = require('testjs-lib');
test.EVPair.makeRandom().toWTF();

除了此链接,我不知道该怎么做,也没有找到任何示例:http://wiki.duktape.org/HowtoModules.html

它告诉我要使用modsearch,但是我不知道如何进行操作或应将其放置在哪里,即使它适用于Duktape Android(https://github.com/square/duktape-android)也不清楚。

是否有人成功完成了这项工作?

最佳答案

假设您要在duktape中包含Underscore

  • 将模块/库代码放在单独的js文件中。在android项目中,您可以将此js文件放入Assets文件夹中。在我们的示例中,它像是:underscore.js
  • 创建一个Java接口(interface),duktape将使用该接口(interface)来获取此js文件的输入流。
    像:

  • ```
    public interface DuktapeHelper {
    
        @JavascriptInterface
        String getUnderScore();
    }
    

    ``
  • 将此Java接口(interface)绑定(bind)到duktape实例中的js接口(interface)。

  • ```
    duktape.bind("helper", DuktapeHelper.class, <instance of your DuktapeHelperImplementation>);
    

    ```
  • 使用之前注入(inject)的modSearch接口(interface)在duktape中实现helper函数。

  • ```
     duktape.evaluate("Duktape.modSearch = function (id) {\n" +
                        "  if (id == \"underscore\") {" +
                        "  return helper.getUnderScore();" +
                        "  } " +
                        "   throw new Error('cannot find module: ' + id);" +
                        "  };" +
                    "var _ = require('underscore')._; ");
    

    ```

    07-27 23:04