Problemi con Rhino su Android

Sto cercando di utilizzare Mozilla Rhino nella mia applicazione Java per Android per valutare alcuni JavaScript. Sto usando il plugin Eclipse + ADT.

Innanzitutto ho provato a scaricare il file Rhino .jar dal sito web di Mozilla e aggiungerlo al progetto come libreria in Eclipse. Eclipse lo ha riconosciuto bene e ha compilato l'applicazione. Tuttavia, quando lo esegue, ottengo un'exception quando chiami Context.evaluateReader() (vedi sotto per la traccia dello stack).

  • Come devo dare le immagini agli angoli arrotondati in Android?
  • non può convertire da android.app.FragmentManager a android.support.v4.app.FragmentManager
  • Quali sono le classi PreferenceManager e SharedPreference utilizzate per Android?
  • Le risorse richiamate dal manifesto non possono variare per configuration
  • Applicazione Android, Il markup nel documento che segue l'elemento radice deve essere ben formato
  • WebView NON apre il video player predefinito di android?
  • Poi ho provato ad aggiungere il codice sorgente di Rhino come un progetto Android separato in Eclipse, contrassegnandolo come una biblioteca e facendolo riferimento nel mio progetto, che era sufficiente per get Eclipse per compilare, ma ha condotto allo stesso errore.

    Questa è la stacktrace che ottengo ( java.lang.UnsupportedOperationException: can't load this type of class file )

     Thread [<7> Thread-8] (Suspended (exception UnsupportedOperationException)) DefiningClassLoader(ClassLoader).defineClass(String, byte[], int, int, ProtectionDomain) line: 338 DefiningClassLoader.defineClass(String, byte[]) line: 62 Codegen.defineClass(Object, Object) line: 159 Codegen.createScriptObject(Object, Object) line: 114 Context.compileImpl(Scriptable, Reader, String, String, int, Object, boolean, Evaluator, ErrorReporter) line: 2440 Context.compileReader(Reader, String, int, Object) line: 1326 Context.compileReader(Scriptable, Reader, String, int, Object) line: 1298 Context.evaluateReader(Scriptable, Reader, String, int, Object) line: 1137 TimetableProcessor.evaluate(InputStream, String, String[]) line: 31 TimetableProcessor.processBasicData(InputStream, String) line: 58 TimetableProcessor.process(InputStream, String) line: 52 TimetableUpdater.update() line: 53 Main$1$1.run() line: 22 

    Il bit del mio codice che colpisce l'exception sembra questo:

      Context cx = Context.enter(); cx.setLanguageVersion(Context.VERSION_1_7); Scriptable scope = cx.initStandardObjects(); try { Object result = cx.evaluateReader(scope, new InputStreamReader(data), /* <<< exception here */ filename, 0, null); } catch (IOException e) { // ... } 

    Ho anche trovato questo post di blog che contiene codice simile e dice che funziona. L'autore dice che ha utilizzato un file jar dal sito di script di Android . L'unico file di jar che ho trovato era in rhino_extras_r3.zip . Tuttavia, esso non contiene file .class ma piuttosto un file classs.dex . Quando ho aggiunto questo come una libreria in Eclipse, non ho riconosciuto le classi che contiene e quindi non sono riuscito a compilare il mio progetto a causa dei riferimenti mancanti alle classi Rhino.

    Tutto l'aiuto su come farlo funzionare è apprezzato!

    3 Solutions collect form web for “Problemi con Rhino su Android”

    Finalmente sono riuscito a farlo funzionare. Avrei dovuto prestare maggiore attenzione a quel blog post che ho collegato.

    Se aggiungo la row

     cx.setOptimizationLevel(-1); 

    per distriggersre le ottimizzazioni, tutto funziona perfettamente.

    Un'edizione di rhino1_7R2.jar compatibile con rhino1_7R2.jar è disponibile sul sito SL4A , nel sistema di controllo delle versioni. Ecco un progetto di esempio che avvolge Rhino e BeanShell in un servizio di interpreti Android.

    Ho scritto una libreria che consente di eseguire Rhino su Android.

    I vantaggi includono:

    • Rhino può funzionare solo sul livello di ottimizzazione -1. La libreria support tutti i livelli.
    • La libreria support l'utilizzo di JavaAdapter, che non è ansible con Rhino base.
    • Anche se non l'ho benchmarkato, dovrebbe dare un aumento delle performance. (Il codice compilato è più veloce del codice interpretato)

    https://github.com/F43nd1r/rhino-android

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.