2016-07-25 2 views
0

Я хотел бы назвать функцию javascript с параметрами из Java в приложении Android, мне не нужно загружать ее в webview, так как мне просто нужно ее вызвать и получить результаты от файл JS, находящийся в папке с ресурсами.Функция вызова JavaScript javascript с параметрами без webview

Я сделал это на iOS, используя JavascriptCore, но я не могу найти ту же функциональность в android.

Посмотрел на Android-агентство и Rihno, но документы и руководства не ясны по этому вопросу.

Я загружаю JS-файл в строку, иначе я не могу пойти, как отправить параметры и получить результаты.

Вот как загрузить файл в строку:

AssetManager assetManager = getAssets(); 
    String jsFile; 

    // To load js file 
    InputStream input; 
    try { 
     input = assetManager.open("authenticate.js"); 

     int size = input.available(); 
     byte[] buffer = new byte[size]; 
     input.read(buffer); 
     input.close(); 

     // byte buffer into a string 
     jsFile = new String(buffer); 
     resultTV.setText(jsFile); 
     Log.d("TAG", jsFile); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

Параметры, чтобы отправить родом из Edittexts.

Javascript функция принимать 2 параметры и возвращать JSON

function authenticate(uName, pWord) 
    { 
     var authenString = JSON.stringify(authenJSON); 

     return authenString; 
    } 

Любая помощь приветствуется.

ответ

1

Вот как я использую Rhino в Android:

/** 
    * 
    * @param javaScriptCode 
    * @param functionNameInJavaScriptCode 
    * @param params Do not pass an array of primitives! For example if passing doubles, pass Double[], not double[] 
    * @return 
    */ 
    public Map<String,Object> execute(String javaScriptCode, String functionNameInJavaScriptCode, Iterable<String> returnObjectKeys, Object... params){ 

     Map<String,Object> rtn = null; 
     // Every Rhino VM begins with the enter() 
     // This Context is not Android's Context 
     Context rhino = Context.enter(); 

     // Turn off optimization to make Rhino Android compatible 
     rhino.setOptimizationLevel(-1); 
     try { 
      final Object[] parameters = new Object[params.length + 1]; 
      for(int i=0; i < params.length; i++){ 
       parameters[i] = params[i]; 
      } 
      parameters[parameters.length - 1] = BuildConfig.DEBUG; 

      Scriptable scope = rhino.initStandardObjects(); 

      rhino.evaluateString(scope, javaScriptCode, "JavaScript", 1, null); 

      // Get the functionName defined in JavaScriptCode 
      Object obj = scope.get(functionNameInJavaScriptCode, scope); 

      if (obj instanceof Function) { 
       Function jsFunction = (Function) obj; 

       // Call the function with params 
       Object jsResult = jsFunction.call(rhino, scope, scope, parameters); 
       if(jsResult == null){ 
        return null; 
       } 
       Scriptable s = (Scriptable) jsResult; 
       rtn = convert(s, returnObjectKeys); 
      } 
      else { 
       throw new IllegalArgumentException("No function " + functionNameInJavaScriptCode + " found in supplied script"); 
      } 
     } finally { 
      Context.exit(); 
     } 

     return rtn; 
    } 

    private Map<String,Object> convert(Scriptable object, Iterable<String> keys){ 

     Map<String,Object> rtn = new HashMap<>(); 
     for(String s : keys){ 
      if(object.has(s,object)){ 
       rtn.put(s, object.get(s, object)); 
      } 
     } 

     return rtn; 
    } 

Я думаю, что я получил большую часть этого от SO, но не может найти вопрос сейчас.