2016-09-29 2 views
0

Java에서 Rhino 내부에서 실행되는 Javascript 함수를 호출하는 것만으로도 간단합니다. Rhino가 만들어진 이유입니다. 나는 자바 스크립트를 실행로드 가능한 통해 처리의 큰 거래를 수행 폰갭 CLI (V 6.3.3) 안드로이드 프로젝트 (API를 19+)이 있습니다Rhino에서 Java 함수 호출

  • 상황 : 나는 문제가 수립하는 데 문제는 이것이다 내가 실제 폰갭 응용 프로그램과 동시에 만드는 오전 - - 코뿔소
  • 폰갭 플러그인 내부에 포함 등 readFromFile(String fileName) 공공, 정적 메소드를 제공 Storage라는 클래스, writeToFile(String fileName,String data) 등 내가 할 수 있도록하려면 무엇
  • 해야할 일은 Rhino에서로드 한 JavaScript 코드에서 Storage.readFromFile 등을 호출하는 것입니다.

이 작업을 수행하는 방법은 나에게 너무 분명하지 않습니다. 지금까지 수행 한 검색에서 ScriptableObject.putProperty을 사용하여 문제의 Java 클래스 인 JavaScript를 Storage JavaScript로 전달합니다. 그러나 이것이 어떻게 수행되어야하는지 그리고 어떻게 JS 끝에서 사용되어야하는지는 다소 혼란 스럽습니다.

나는 코뿔소 여기에 100 개 미만의 추종자는 아마이 질문에 대답되지 않았 음으로 깜짝 선물을 제공한다을 가지고 있음을 감안할 때 올바른 방향

답변

1

날 지점 수있을 여기 사람에게 가장 감사하게 될 것입니다. 그 동안 솔루션을 직접 찾을 수 있었고 매우 간단 해졌습니다. 이 스레드와 관련된 다른 사용자의 이익을 위해 아래에서 공유합니다.

Storage 클래스는 매우 간단합니다. 내가 코뿔소를 통해 자바에서 자바 스크립트를 호출 할 때 이런 일이

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

단순히 내 함수의 마지막으로 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); 
} 

매개 변수

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'); 
... 
} 
관련 문제