Как получить доступ к модулю Javascript с Duktape на Android

Я успешно разбираю и оцениваю файл javascript с Duktape в своем приложении Android с помощью Kotlin.

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- андроид).

Кто-нибудь сделал это успешно, чтобы пролить свет на этот вопрос?

Ответ 1

в testjs-lib.js, добавьте JS-код, который использует сам модуль testjs-lib.js сам экспортирует. Например:

function myModule() {
  this.hello = function() {
    return 'hello!';
  }

  this.goodbye = function() {
    return 'goodbye!';
  }
}

module.exports = myModule;

//You code goes here
console.log(myModule.hello());
console.log(myModule.goodbye());

Затем попросите Duktape оценить весь файл.

Ответ 2

Предположим, вы хотите включить Underscore в duktape.

  1. Поместите код модуля/библиотеки в отдельный файл js. В проекте Android вы можете поместить этот файл js в папку " Assets ". В нашем примере это будет выглядеть так: underscore.js

  2. Создайте java-интерфейс, который будет использоваться duktape, чтобы получить входной поток в этот js файл. Sth вроде:

"""

public interface DuktapeHelper {

    @JavascriptInterface
    String getUnderScore();
}

"" ""

  1. Свяжите этот java-интерфейс с интерфейсом js в экземпляре duktape.

"""

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

"""

  1. Функция Implment modSearch в 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')._; ");

"""