日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

【Android】不使用WebView来执行Javascript脚本(Rhino)

發(fā)布時間:2025/3/21 Android 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android】不使用WebView来执行Javascript脚本(Rhino) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?

?

前言

動態(tài)執(zhí)行腳本能有效的降低重要功能硬編碼帶來的問題,尤其是依賴于第三方的應用,可以通過動態(tài)腳本+在線參數(shù)(例如友盟在線參數(shù))再不更新應用的情況下升級功能。


聲明

歡迎轉(zhuǎn)載,但請保留文章原始出處:)?
博客園:http://www.cnblogs.com
農(nóng)民伯伯:?http://over140.cnblogs.com?

?

正文

一、準備

項目地址:https://developer.mozilla.org/en-US/docs/Rhino

項目說明:由Mozilla開發(fā),是 JavaScript 一種基于Java的實現(xiàn)。

項目使用:把js.jar拷貝到項目工程既可。?

?

二、 代碼

主要實現(xiàn)了從Java中執(zhí)行js中的函數(shù)、從js中調(diào)用Java中的方法,代碼:

public?class?MainActivity?extends?Activity?{

????@Override
????protected?void?onCreate(Bundle?savedInstanceState)?{
????????super.onCreate(savedInstanceState);
????????setContentView(R.layout.activity_main);

????????TextView?text1?=?(TextView)?findViewById(android.R.id.text1);
????????TextView?text2?=?(TextView)?findViewById(android.R.id.text2);

????????text1.setText(runScript(JAVA_CALL_JS_FUNCTION,?"Test",?new?String[]?{}));

????????text2.setText(runScript(JS_CALL_JAVA_FUNCTION,?"Test",?new?String[]?{}));
????}

????/**?Java執(zhí)行js的方法?*/
????private?static?final?String?JAVA_CALL_JS_FUNCTION?=?"function?Test(){?return?'農(nóng)民伯伯?java?call?js?Rhino';?}";

????/**?js調(diào)用Java中的方法?*/
????private?static?final?String?JS_CALL_JAVA_FUNCTION?=?//
????"var?ScriptAPI?=?java.lang.Class.forName(\""?+?MainActivity.class.getName()?+?"\",?true,?javaLoader);"?+?//
????????"var?methodRead?=?ScriptAPI.getMethod(\"jsCallJava\",?[java.lang.String]);"?+?//
????????"function?jsCallJava(url)?{return?methodRead.invoke(null,?url);}"?+?//
????????"function?Test(){?return?jsCallJava();?}";

????/**
?????*?執(zhí)行JS
?????*?
?????*?
@param?js?js代碼
?????*?
@param?functionName?js方法名稱
?????*?
@param?functionParams?js方法參數(shù)
?????*?
@return
?????
*/
????public?String?runScript(String?js,?String?functionName,?Object[]?functionParams)?{
????????Context?rhino?=?Context.enter();
????????rhino.setOptimizationLevel(-1);
????????try?{
????????????Scriptable?scope?=?rhino.initStandardObjects();

????????????ScriptableObject.putProperty(scope,?"javaContext",?Context.javaToJS(MainActivity.this,?scope));
????????????ScriptableObject.putProperty(scope,?"javaLoader",?Context.javaToJS(MainActivity.class.getClassLoader(),?scope));

????????????rhino.evaluateString(scope,?js,?"MainActivity",?1,?null);

????????????Function?function?=?(Function)?scope.get(functionName,?scope);

????????????Object?result?=?function.call(rhino,?scope,?scope,?functionParams);
????????????if?(result?instanceof?String)?{
????????????????return?(String)?result;
????????????}?else?if?(result?instanceof?NativeJavaObject)?{
????????????????return?(String)?((NativeJavaObject)?result).getDefaultValue(String.class);
????????????}?else?if?(result?instanceof?NativeObject)?{
????????????????return?(String)?((NativeObject)?result).getDefaultValue(String.class);
????????????}
????????????return?result.toString();//(String)?function.call(rhino,?scope,?scope,?functionParams);
????????}?finally?{
????????????Context.exit();
????????}
????}

????public?static?String?jsCallJava(String?url)?{
????????return?"農(nóng)民伯伯?js?call?Java?Rhino";
????}
}

?

三、下載

SampleRhino.zip(2013-12-05)?

?

四、相關文章

4.1 Embed JavaScript in Android Java Code with Rhino?

4.2 JavaScript (Rhino) on Android?

4.3 純java 的javascript引擎:rhino?

4.4 深入淺出Rhino:Java與JS互操作?

?

五、其他

注意,混淆的時候js.jar可能混淆不過去,請參照文章4.1的方法。

?

總結(jié)

以上是生活随笔為你收集整理的【Android】不使用WebView来执行Javascript脚本(Rhino)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。