2016-09-29 2 views
0

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

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

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

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

ответ

1

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

My 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'); 
... 
} 
Смежные вопросы