web-dev-qa-db-fra.com

Comment exécuter JavaScript sur Android?

J'ai un code qui utilise ScriptEngineManager, classe ScriptEngine pour exécuter du code JavaScript en utilisant Java. Mais cela fonctionne très bien dans Java SE et pas dans Android - SDK show error des classes manquantes. Est-il possible d'exécuter du code JS sous Android? Je vous remercie. 

44
user1078760

AndroidJSCore est un excellent. Et voici une autre petite bibliothèque que j'ai écrite pour évaluer 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)
  }
});

Il crée une WebView dans les coulisses. Fonctionne sur Android version 3 et plus récente.

17
Evgenii

Vous pouvez utiliser Webview qui hérite de la classe View. Créez une balise XML et utilisez la fonction findViewById() à utiliser dans l'activité. Mais pour utiliser le JavaScript, vous pouvez créer un fichier HTML contenant le code JavaScript. L'exemple blelow pourrait aider.

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

N'oubliez pas que JS s'exécutera sur WebView, et non dans un environnement natif. Par conséquent, vous pourriez rencontrer un FPS lent ou lent dans l'émulateur. Toutefois, lors de l'utilisation sur un téléphone réel, le code peut s'exécuter rapidement, en fonction de la rapidité de votre téléphone.

12
noob

http://divineprogrammer.blogspot.com/2009/11/javascript-rhino-on-Android.html vous aidera à démarrer. ScriptEngine est une chose de Java. Android n'a pas de machine virtuelle Java, mais une DalvikVM non identique mais similaire.

7
Fredrik

UPDATE 2018: AndroidJSCore a été remplacé par LiquidCore , basé sur V8. Non seulement cela inclut le moteur V8, mais tout Node.js est également disponible.

Réponse originale: AndroidJSCore est un wrapper JNI Java Android autour de la bibliothèque JavaScriptCore C de Webkit. Il est inspiré du framework JavaScriptCore d'Objective-C inclus de manière native dans iOS 7. Il est très utile de pouvoir utiliser JavaScript de manière native dans une application sans recourir à l'injection de JavaScript sur une WebView volumineuse, lente et à sécurité limitée , tels que les jeux ou les plates-formes prenant en charge les plugins. Cependant, son utilisation est artificiellement limitée, car la structure n'est prise en charge que sur iOS. La plupart des développeurs souhaitent utiliser des technologies adaptées aux deux principaux systèmes d'exploitation mobiles. AndroidJSCore a été conçu pour répondre à cette exigence.

Par exemple, vous pouvez partager des objets Java et effectuer des appels asynchrones:

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"
    );
}
7
Eric Lange

Le package javax.script ne fait pas partie du SDK Android. Vous pouvez exécuter JavaScript dans une vue Web, comme décrit ici . Vous pouvez peut-être utiliser Rhino , comme décrit ici . Vous pouvez également consulter le Scripting Layer for Android project.

6
Ted Hopp

Vous pouvez utiliser la bibliothèque Rhino pour exécuter JavaScript sans WebView.

Téléchargez Rhino d 'abord, décompressez - le, mettez le fichier js.jar dans le dossier libs. Il est très petit, vous n'avez donc pas besoin de craindre que votre fichier apk ne soit ridiculement volumineux à cause de cette archive.

Voici un code simple pour exécuter du code 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();
}

Vous pouvez voir plus de détails sur mon post .

6
Wesley

Je cherchais aussi un moyen d’exécuter javascript sur Android et suis tombé sur bibliothèque j2v8 . Ceci est un wrapper Java pour le moteur v8 de Google.

Pour l'utiliser, ajoutez une dépendance:

compile 'com.eclipsesource.j2v8:j2v8_Android:3.0.5@aar'

Il a une API assez simple, mais je n'ai trouvé aucun document en ligne à part javadoc dans répertoire maven . Les articles sur leur blog sont également utiles.

Exemple de code tiré de cet article :

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

Étant donné que (ScriptEngineManager } et ScriptEngine font partie du JDK et du Android SDK, ce n'est pas la même chose que le JDK, je dirais que vous pouvez t utilisez ces classes pour travailler avec JavaScript sous Android.

Vous pouvez consulter le documentation de référence/index de package du SDK Android pour voir quelles classes sont incluses (que pouvez-vous utiliser sur Android immédiatement) et lesquelles d'entre elles sont manquantes?.

1
Kohányi Róbert

Je viens de trouver l'App JavaScript for Android, qui est le moteur JavaScript de Rhino pour Java. Il peut utiliser toutes les classes Java, il a donc un grand potentiel. Le problème est que cela pourrait être lent, car ce n’est pas vraiment optimisé (charge de processeur importante). Il existe un autre moteur JavaScript appelé Nashorn, mais cela ne fonctionne malheureusement pas avec le moteur Java DalvikVM de Google (ne prend pas en charge les optimisations du moteur Oracle Java). J'espère que Google s'en tiendra à cela, je voudrais juste aimer ça!

1
lama12345

Si vous souhaitez exécuter du code javascript sur le navigateur Chrome conformément à la question, copiez ce code et collez-le dans la barre d'adresse: 

data: text/html, <html contenteditable><title> Notepad </title><script> alert ('Test d'alerte Abhasker sur mobile'); </script></html>

0
AbhiNickz