Вызов функции Java из Rhino

Вызов функций Javascript, выполняющихся внутри Rhino из Java, достаточно прост - вот почему Rhino был создан. У меня проблемы с установкой:

  • Контекст: у меня есть Android-проект Phonegap CLI (v 6.3.3) (API 19+), в котором я выполняю большую часть обработки с помощью загружаемого JavaScript, работающего внутри Rhino
  • Плагин PhoneGap, который я создаю одновременно с самим приложением PhoneGap, содержит класс Storage который предоставляет публичные, статические методы, такие как readFromFile(String fileName), writeToFile(String fileName,String data) и т.п.
  • То, что я хочу сделать, это позвонить Storage.readFromFile и т.д. из моего загруженного кода JavaScript в Rhino.

То, как это должно быть сделано, мне не слишком понятно. Из проведенных мною поисков пока ScriptableObject.putProperty передать рассматриваемый класс Java, Storage в моем случае JavaScript. Однако то, как это должно быть сделано, а затем то, как это должно использоваться на стороне JS, оставляет меня в замешательстве.

Я был бы очень признателен всем, кто мог бы указать мне правильное направление

1 ответ

Решение

Учитывая, что у Rhino здесь менее 100 подписчиков, не удивительно, что на этот вопрос не было ответа. Тем временем мне удалось найти решение самостоятельно, и оно оказалось очень простым. Я поделюсь этим ниже для пользы любого, кто сталкивается с этой темой.

мой Storage класс очень прост. Это выглядит примерно так

public class Storage
{
 public static boolean haveFile(){}
 public static boolean readFromFile(String fname){}
 ...
} 

Когда я вызываю Javascript из Java через Rhino, я просто передаю новый экземпляр Storage класс как последний из моих параметров функции

Context rhino = Context.enter();
Object[] functionParams = new Object[] {"Other parameters",new Storage()};
rhino.setOptimizationLevel(-1);
try 
{
 Scriptable scope = rhino.initStandardObjects();
 String rhinoLog = "var log = Packages.io.vec.ScriptAPI.log;";
 String code = /*Javascript code here* as shown separately below/;
 rhino.evaluateString(scope, rhinoLog + code, "ScriptAPI", 1, null);
 Function function = (Function) scope.get("jsFunction", scope);
 Object jsResult = function.call(rhino,scope,scope,functionParams);
}

где код Javascript

function jsFunction(a,s)
{
 //a - or a,b,c etc - here will be the "other" parameters
 //s - will be the instance of the Java side Storage class passed above
 //now you can do things like
 s.writeToFile('fileName','fileData');
 var fd = s.readFromFile('fileName');
 s.dropFile('fileName');
 ...
}
Другие вопросы по тегам