【问题标题】:Android call javascript function with parameters without webviewAndroid调用javascript函数,参数不带webview
【发布时间】:2016-11-29 06:32:00
【问题描述】:

我想在一个android应用程序中调用一个带有Java参数的javascript函数,我不需要在webview中加载它,因为我只需要调用它并从资产中的JS文件中获取结果文件夹。

我是在 iOS 上使用 JavascriptCore 完成的,但在 android 中找不到相同的功能。

查找了 AndroidJSCore 和 Rihno,但文档和教程对此主题不清楚。

我将 JS 文件加载到 String 中,进一步我无法了解如何发送参数并获取结果。

以下是将文件加载到字符串中的方法:

    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;
    }

感谢任何帮助。

【问题讨论】:

    标签: javascript java android


    【解决方案1】:

    这是我在 Android 中使用 Rhino 的方法:

    /**
         *
         * @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 那里得到的,但现在找不到问题。

    【讨论】:

      猜你喜欢
      • 2017-10-15
      • 1970-01-01
      • 1970-01-01
      • 2013-06-06
      • 2011-05-18
      • 2012-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多