Проблемы с использованием Rhino на Android - PullRequest
18 голосов
/ 05 октября 2010

Я пытаюсь использовать Mozilla Rhino в своем Java-приложении для Android, чтобы оценить JavaScript. Я использую плагин Eclipse + ADT.

Сначала я попытался просто загрузить файл Rhino .jar с веб-сайта Mozilla и добавить его в проект в виде библиотеки в Eclipse. Eclipse распознал его и скомпилировал приложение. Однако при его запуске я получаю исключение при вызове Context.evaluateReader() (см. Ниже трассировку стека).

Затем я попытался добавить исходный код Rhino в качестве отдельного проекта Android в Eclipse, пометив его как библиотеку и сославшись на него в моем проекте, чего было достаточно, чтобы Eclipse заставил его скомпилироваться, но привел к той же ошибке.

Это трассировка стека, которую я получаю (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

Бит моего кода, который попадает в исключение, выглядит так:

        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) {
            // ...
        }

Я также нашел это сообщение в блоге , которое содержит похожий код и говорит, что оно работает. Автор говорит, что использовал файл jar с сайта Android Scripting . Единственный файл jar, который я нашел, был в rhino_extras_r3.zip. Однако он не содержит .class файлов, а скорее classes.dex. Когда я добавил это как библиотеку в Eclipse, он не распознал содержащиеся в нем классы и, таким образом, не смог скомпилировать мой проект из-за отсутствующих ссылок на классы Rhino.

Любая помощь в том, как заставить это работать, ценится!

Ответы [ 3 ]

34 голосов
/ 05 октября 2010

Я наконец получил его на работу.Я должен был уделить больше внимания тому сообщению в блоге, на которое я ссылался.

Если я добавлю строку

cx.setOptimizationLevel(-1);

, чтобы отключить оптимизацию, все работает отлично.

11 голосов
/ 05 октября 2010

Android-совместимая версия rhino1_7R2.jar доступна на сайте SL4A в системе контроля версий. Вот пример проекта , который объединяет Rhino и BeanShell в службу интерпретатора Android.

1 голос
/ 20 марта 2016

Я написал библиотеку, которая позволяет запускать Rhino на Android.

Преимущества включают в себя:

  • Rhino может работать только на уровне оптимизации -1.Библиотека поддерживает все уровни.
  • Библиотека поддерживает использование JavaAdapter, что невозможно с базовым Rhino.
  • Хотя я и не тестировал этот показатель, это должно повысить производительность.(Скомпилированный код работает быстрее, чем интерпретируемый)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...