use*_*760 45 javascript java android
我有使用ScriptEngineManager,ScriptEngine类的代码,用于使用Java执行JavaScript代码.但它在Java SE中运行良好,并且在Android中不起作用 - SDK显示缺少类的错误.是否可以在Android中执行JS代码?谢谢.
Evg*_*nii 18
AndroidJSCore很棒.这是我为评估JavaScript而编写的另一个小库:
https://github.com/evgenyneu/js-evaluator-for-android
jsEvaluator.evaluate("function hello(){ return 'Hello world!'; } hello();", new JsCallback() {
@Override
public void onResult(final String result) {
// get result here (optional)
}
});
Run Code Online (Sandbox Code Playgroud)
它在幕后创建了一个WebView.适用于Android版本3及更高版本.
noo*_*oob 12
您可以使用继承View类的Webview.创建XML标记并使用findViewById()函数在活动中使用.但是要使用JavaScript,您可以创建包含JavaScript代码的HTML文件.这个例子可能会有所帮助.
Webview browser=(Webview) findViewById(R.main.browser); //if you gave the id as browser
browser.getSettings().setJavaScriptEnabled(true); //Yes you have to do it
browser.loadUrl("file:///android_asset/JsPage.html"); //If you put the HTML file in asset folder of android
Run Code Online (Sandbox Code Playgroud)
请记住,JS将在WebView上运行,而不是在本机环境中运行,因此您可能会在模拟器中遇到延迟或缓慢的FPS.但是,在实际手机上使用时,代码可能会快速运行,具体取决于手机的速度.
http://divineprogrammer.blogspot.com/2009/11/javascript-rhino-on-android.html将帮助您入门.ScriptEngine是一个java的东西.Android没有JVM,但是没有相同但相似的DalvikVM.
UPDATE 2018: AndroidJSCore已被取代LiquidCore,这是基于V8.它不仅包括V8引擎,而且还提供所有Node.js.
原始答案: AndroidJSCore是围绕Webkit的JavaScriptCore C库的Android Java JNI包装器.它的灵感来自iOS 7中原生包含的Objective-C JavaScriptCore框架.能够在应用程序中原生使用JavaScript,而无需在臃肿,缓慢,安全受限的WebView上使用JavaScript注入,这对于许多类型的应用程序非常有用,例如支持插件的游戏或平台.但是,它的使用是人为限制的,因为该框架仅在iOS上受支持.大多数开发人员希望使用可扩展到两个主要移动操作系统的技术.AndroidJSCore旨在支持该要求.
例如,您可以共享Java对象并进行异步调用:
public interface IAsyncObj {
public void callMeMaybe(Integer ms, JSValue callback) throws JSException;
}
public class AsyncObj extends JSObject implements IAsyncObj {
public AsyncObj(JSContext ctx) throws JSException { super(ctx,IAsyncObj.class); }
@Override
public void callMeMaybe(Integer ms, JSValue callback) throws JSException {
new CallMeLater(ms).execute(callback.toObject());
}
private class CallMeLater extends AsyncTask<JSObject, Void, JSObject> {
public CallMeLater(Integer ms) {
this.ms = ms;
}
private final Integer ms;
@Override
protected JSObject doInBackground(JSObject... params) {
try {
Thread.sleep(ms);
} catch (InterruptedException e) {
Thread.interrupted();
}
return params[0];
}
@Override
protected void onPostExecute(JSObject callback) {
JSValue args [] = { new JSValue(context,
"This is a delayed message from Java!") };
try {
callback.callAsFunction(null, args);
} catch (JSException e) {
System.out.println(e);
}
}
}
}
public void run() throws JSException {
AsyncObj async = new AsyncObj(context);
context.property("async",async);
context.evaluateScript(
"log('Please call me back in 5 seconds');\n" +
"async.callMeMaybe(5000, function(msg) {\n" +
" alert(msg);\n" +
" log('Whoomp. There it is.');\n" +
"});\n" +
"log('async.callMeMaybe() has returned, but wait for it ...');\n"
);
}
Run Code Online (Sandbox Code Playgroud)
您可以使用Rhino库来执行不带WebView的JavaScript.
首先下载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();
}
Run Code Online (Sandbox Code Playgroud)
您可以在我的帖子中查看更多详细信息.
我也在寻找一种在Android上运行javascript并遇到j2v8库的方法.这是谷歌v8引擎的java包装器.
要使用它,请添加依赖项:
compile 'com.eclipsesource.j2v8:j2v8_android:3.0.5@aar'
Run Code Online (Sandbox Code Playgroud)
它有非常简单的api,但除了maven存储库中的 javadoc之外,我还没有找到任何在线文档.他们博客上的文章也很有用.
本文的代码示例:
public static void main(String[] args) {
V8 runtime = V8.createV8Runtime();
int result = runtime.executeIntegerScript(""
+ "var hello = 'hello, ';\n"
+ "var world = 'world!';\n"
+ "hello.concat(world).length;\n");
System.out.println(result);
runtime.release();
}
Run Code Online (Sandbox Code Playgroud)
鉴于ScriptEngineManager和ScriptEngine是JDK的一部分,并且Android SDK与JDK 不是一回事,我想说您不能使用这些类在 Android 下处理 JavaScript。
您可以检查 Android SDK 的参考文档/包索引,以查看包含哪些类(您可以在 Android 上开箱即用哪些类)以及缺少哪些类。
| 归档时间: |
|
| 查看次数: |
82254 次 |
| 最近记录: |