Как выполнить JavaScript на Android?

У меня есть код, который использует ScriptEngineManager, ScriptEngine для выполнения JavaScript-кода с использованием Java. Но он отлично работает в Java SE и не работает в Android - SDK показывает ошибку отсутствующих классов. Можно ли выполнить JS-код в Android? Спасибо.

Ответ 1

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

Он создает WebView за кулисами. Работает на Android версии 3 и новее.

Ответ 2

Вы можете использовать Webview, который наследует класс View. Создайте тег XML и используйте функцию findViewById(), которая будет использоваться в этом действии. Но для использования JavaScript вы можете создать HTML файл, содержащий код JavaScript. Пример blelow может помочь.

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

Помните, что JS будет работать в WebView, а не в среде, поэтому вы можете столкнуться с задержкой или медленным FPS в эмуляторе. Однако при использовании на реальном телефоне код может работать быстро, в зависимости от того, насколько быстро ваш телефон.

Ответ 4

Пакет javax.script не является частью Android SDK. Вы можете выполнить JavaScript в WebView, как описано здесь. Возможно, вы можете использовать Rhino, как описано здесь. Вы также можете посмотреть проект Scripting Layer for Android.

Ответ 5

AndroidJSCore - это обертка JNI для Android Java вокруг библиотеки WebCit JavaScriptCore C. Это вдохновлено Objective-C JavaScriptCore Framework, включенным изначально в iOS 7. Возможность естественного использования JavaScript в приложении без необходимости использования JavaScript-инъекции в раздутом, медленном, защищенном от ограничений WebView очень полезна для многих типов приложений, таких как игры или платформы, поддерживающие плагины. Однако его использование искусственно ограничено, поскольку структура поддерживается только на iOS. Большинство разработчиков хотят использовать технологии, которые будут масштабироваться в обеих основных мобильных операционных системах. AndroidDAore был разработан для поддержки этого требования.

Например, вы можете делиться объектами 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"
    );
}

Ответ 6

Вы можете использовать библиотеку Rhino для выполнения JavaScript без WebView.

сначала загрузите Rhino, распакуйте его, поместите файл js.jar в папку libs. Это очень мало, поэтому вам не нужно беспокоиться, что ваш файл apk будет смехотворно большим из-за этой внешней банки.

Вот несколько простых кодов для выполнения кода JavaScript.

Object[] params = new Object[] { "javaScriptParam" };

// Every Rhino VM begins with the enter()
// This Context is not Android 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();
}

Вы можете увидеть более подробную информацию на мой пост.

Ответ 7

Я также искал способ запустить javascript на Android и наткнулся на j2v8 library. Это оболочка java для движка Google v8.

Чтобы использовать его, добавьте зависимость:

compile 'com.eclipsesource.j2v8:j2v8_android:[email protected]'

У него довольно простой api, но я не нашел никаких документов в Интернете, кроме javadoc, в репозитории maven. Статьи о их блог также полезны.

Пример кода из в этой статье:

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

Ответ 8

Учитывая, что ScriptEngineManager и ScriptEngine являются частью JDK и Android SDK - это не то же самое, что JDK, я бы сказал, что вы не можете использовать эти классы для работы с JavaScript под Android.

Вы можете проверить Android SDK справочную документацию/индекс пакета, чтобы узнать, какие классы включены (что вы можете использовать на Android из коробки ) и какие из них отсутствуют.

Ответ 9

Я только что нашел приложение JavaScript for Android, которое является механизмом JavaScript Rhino для Java. Он может использовать все Java-классы, поэтому он имеет большой потенциал. Проблема в том, что она может быть медленной, поскольку она не оптимизирована (большая загрузка процессора). Существует еще один движок JavaScript под названием Nashorn, но, к сожалению, он не работает в Java DalvikVM Java-движке (не поддерживает оптимизацию ядра Oracle Java). Я надеюсь, что Google будет поддерживать это, мне просто понравится!

Ответ 10

Если вы хотите запустить некоторый код javascript на браузере Chrome в соответствии с вопросом, скопируйте этот код и вставьте его в адресную строку:

data: text/html, <html contenteditable> <title> Предупреждение Notepad </title> <script> ( "Тест на предупреждение абакстера на мобильном телефоне" ); </script> </html>