使用 V8 JavaScript 引擎在没有 Web 视图的情况下执行 JS 库
Use V8 JavaScript engine to execute JS lib without web view
我正在开发一个JavaScript组件,它负责向服务器发出请求并将结果调度到UI。通过在JavaScript中执行此操作,我能够在几种类型的UI中使用我的组件:Android应用程序,iOS应用程序,桌面应用程序(QT),Web应用程序...
所有这些 UI 都实例化了一个 Web 视图,因此当 UI 加载专用 URL 时,我的组件会启动 ( webview.load("file://myfirstWebPage.html")
)。
第一个网页加载所有JavaScript组件,完成后,UI能够向JavaScript组件发出一些请求,JavaScript组件向服务器发出请求,当它有响应时,它会将其调度回客户端(UI Android,UI iOS ...
这种架构工作正常,但我想知道是否有另一种方法可以在不使用每个客户端上的 Web 视图的情况下加载 JavaScript 组件?
V8发动机可以帮助我吗?
如果我理解你的问题,你正在寻找一种在不使用WebView的情况下跨许多平台(iOS,Android等)执行JavaScript的方法。 该解决方案将特定于平台,因为每个平台的基础 WebView 实现甚至都不同。
对于 Android,只要设备附带 V8,您就可以通过其 API 创建新的 V8 上下文并使用它来执行您的 JavaScript。设备必须实际附带 V8。这个答案可能会进一步帮助你。
对于使用 JavaScriptCore 的 iOS,iOS7 的最新开发已经允许您加载和运行任意 JavaScript 代码。 在此处阅读更多内容。
对于安卓部分。我使用了 J2V8 JavaScript 库。它是Google的V8 JavaScript引擎的Java包装器。有关更多详细信息,请参阅此处。
如何使用V8
,但你可以改用Rhino
库。也不涉及WebView。
首先下载 Rhino 并解压缩,将 js.jar 文件放在 libs 文件夹下。它非常小,因此您无需担心您的apk文件会因为这个外部jar而大得离谱。
下面是一些执行 JavaScript 代码的简单代码。
Object[] params = new Object[] { "javaScriptParam" };
// 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 {
Scriptable scope = rhino.initStandardObjects();
// Note the forth argument is 1, which means the JavaScript source has
// been compressed to only one line using something like YUI
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, params);
// Parse the jsResult object to a String
String result = Context.toString(jsResult);
}
} finally {
Context.exit();
}
您可以在我的帖子中看到更多详细信息。
我发现这个非常漂亮的开源 ECMAScript 兼容 JS 引擎完全用 C 语言编写,称为 duktape
Duktape是一个可嵌入的Javascript引擎,专注于可移植性和紧凑的占地面积。
您仍然需要通过 ndk-jni 业务,但这非常简单。只需在此处将来自可分发源的duktape.c
和duktape.h
(如果您不想自己完成构建过程)包含在 jni 文件夹中,更新 Android.mk 和所有这些东西。
下面是一个示例 C 代码段,可帮助您入门。
#include "duktape.h"
JNIEXPORT jstring JNICALL
Java_com_ndktest_MainActivity_evalJS
(JNIEnv * env, jobject obj, jstring input){
duk_context *ctx = duk_create_heap_default();
const char *nativeString = (*env)->GetStringUTFChars(env, input, 0);
duk_push_string(ctx, nativeString);
duk_eval(ctx);
(*env)->ReleaseStringUTFChars(env, input, nativeString);
jstring result = (*env)->NewStringUTF(env, duk_to_string(ctx, -1));
duk_destroy_heap(ctx);
return result;
}
祝你好运!
- 在不破坏未定义函数的情况下,对多个视图使用单个js文件
- 如何在不使用ajax的情况下将pair值添加到数组并发送到django中的视图
- 在不刷新整个网格的情况下,向Asp.net网格视图添加新行
- 如何在默认情况下将主干视图设置为singleton
- 我可以在不显示网络视图的情况下使用phonegap吗
- 如何在不刷新页面的情况下每次单击一组选项卡时刷新视图内容窗格
- Angular UI Router-在不了解第二级嵌套视图的情况下更改第三级嵌套视图
- 是否可以在没有视图状态和回发的情况下使用asp.net web表单
- 在asp.net mvc 3中,如何在不刷新页面的情况下从部分视图获取值到父视图
- 在不涉及控制器的情况下对MVC视图列表中的项进行排序
- 确保数据在没有单独请求的情况下加载到视图中
- 如何在不使用映射的情况下更新视图模型
- 在这种情况下如何获取部分视图数据
- 在没有页面加载的情况下生成网格视图
- 在特定视图的情况下将按钮隐藏在部分
- 使用 V8 JavaScript 引擎在没有 Web 视图的情况下执行 JS 库
- 在不使用滚动条的情况下在巨大的 html 页面周围移动浏览器视图
- 挖空:在不清除视图模型中的值的情况下更改选择列表中的选项
- Ember - 如何在没有 html 的情况下呈现视图的属性
- 如何在没有持续服务器请求的情况下在 AngularJS 中进行视图重定向