2010-10-04 7 views
17

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!

Odpowiedz

32

W końcu udało mi się. Powinienem był zwrócić większą uwagę na ten wpis na blogu, który łączyłem.

Jeśli dodać linię

cx.setOptimizationLevel(-1); 

wyłączyć optymalizacje, wszystko działa idealnie.

+12

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

+0

Potwierdzam, że to pomaga :-) – agibalov

+1

@Listill zmierzy się z tym samym problemem po dodaniu tej linii .. –

11

Wersja rhino1_7R2.jar z systemem Android jest dostępna na stronie SL4A w systemie kontroli wersji. Here is a sample project, który zamyka Rhino i BeanShell w serwisie tłumacza Androida.

+0

Dzięki, nie zauważyłem tego pliku jar, ponieważ nie został wymieniony w sekcji download. Nadal nie rozwiązał mojego problemu (opublikowałem moje aktualne rozwiązanie), ale zdecydowanie zasługujesz na upomnienie za pokazanie mi, gdzie znajduje się plik jar i przykładowy projekt, który mogę wykorzystać jako przykład. –

+1

Oto bezpośredni link: http://code.google.com/p/android-scripting/source/browse/rhino/rhino1_7R2.jar –

1

Napisałem bibliotekę, która pozwala uruchomić Rhino na Androida.

Korzyści obejmują:

  • Rhino może pracować tylko na poziomie optymalizacji -1. Biblioteka obsługuje wszystkie poziomy.
  • Biblioteka obsługuje korzystanie z JavaAdapter, co nie jest możliwe w przypadku bazy Rhino.
  • Mimo że nie przeprowadziłem testu porównawczego, należy zwiększyć wydajność. (Skompilowany kod jest szybszy niż kod interpretowany)

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

Powiązane problemy