gpt4 book ai didi

javascript - Android 不带webview调用带参数的javascript函数

转载 作者:行者123 更新时间:2023-12-03 06:27:38 24 4
gpt4 key购买 nike

我想在Android应用程序中调用带有Java参数的javascript函数,我不需要在webview中加载它,因为我只需要调用它并从 Assets 中的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;
}

感谢任何帮助。

最佳答案

以下是我在 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 那里得到的,但现在找不到问题了。

关于javascript - Android 不带webview调用带参数的javascript函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38575826/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com