Próbuję użyć Mozilla Rhino w mojej aplikacji Java dla systemu Android do oceny niektórych skryptów JavaScript. Korzystam z wtyczki Eclipse + ADT.Problemy z używaniem Rhino na Androidzie
Najpierw próbowałem po prostu pobrać plik .jar Rhino ze strony Mozilli i dodać go do projektu jako bibliotekę w Eclipse. Eclipse rozpoznał to dobrze i skompilował aplikację. Jednak podczas jego uruchamiania otrzymuję wyjątek podczas wywoływania Context.evaluateReader()
(patrz poniżej dla śledzenia stosu).
Potem próbowałem dodać kod źródłowy Rhino jako osobny projekt Androida w Eclipse, oznaczając go jako bibliotekę i odwołując się do niego w moim projekcie, co wystarczyło, aby Eclipse dostarczył go do kompilacji, ale doprowadził do tego samego błędu .
To StackTrace otrzymuję (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
Bit mojego kodu, który uderza wyjątek wygląda następująco:
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) {
// ...
}
Znalazłem również this blog post który zawiera podobny kod i mówi to działa. Autor twierdzi, że użył pliku jar z witryny Android Scripting. Jedyny plik jar, który tam znalazłem, był w rhino_extras_r3.zip
. Jednak nie zawiera plików .class
, ale raczej plik classes.dex
. Kiedy dodałem to jako bibliotekę w Eclipse, nie rozpoznałem zawartych w nim klas, a tym samym nie udało mi się skompilować mojego projektu z powodu brakujących odniesień do klas Rhino.
Każda pomoc w jak uzyskać to do pracy jest doceniana!
Domyślnie Rhino próbuje generować bajt JVM w locie, jako rodzaj JavaScript JIT. To fajne i wszystko, ale Android nie uruchamia kodu bajtowego JVM - działa kod bajtowy Dalkwi. Dlatego musisz wyłączyć optymalizację za pomocą kodu, który pokazałeś, aby umożliwić działanie Rhino. – CommonsWare
Potwierdzam, że to pomaga :-) – agibalov
@Listill zmierzy się z tym samym problemem po dodaniu tej linii .. –