Как получить доступ к модулю 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.
-
Поместите код модуля/библиотеки в отдельный файл js. В проекте Android вы можете поместить этот файл js в папку " Assets
". В нашем примере это будет выглядеть так: underscore.js
-
Создайте java-интерфейс, который будет использоваться duktape, чтобы получить входной поток в этот js файл. Sth вроде:
"""
public interface DuktapeHelper {
@JavascriptInterface
String getUnderScore();
}
"" ""
- Свяжите этот java-интерфейс с интерфейсом js в экземпляре duktape.
"""
duktape.bind("helper", DuktapeHelper.class, <instance of your DuktapeHelperImplementation>);
"""
- Функция 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')._; ");
"""