Проблемы с использованием Rhino на Android
Я пытаюсь использовать 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 ответа
Я наконец получил это на работу. Я должен был уделить больше внимания тому посту в блоге, на который я ссылался.
Если я добавлю строку
cx.setOptimizationLevel(-1);
чтобы отключить оптимизацию, все работает отлично.
Android-совместимая версия rhino1_7R2.jar
доступно на сайте SL4A, в системе контроля версий. Вот пример проекта, который объединяет Rhino и BeanShell в службу интерпретатора Android.
Я написал библиотеку, которая позволяет запускать Rhino на Android.
Преимущества включают в себя:
- Rhino может работать только на уровне оптимизации -1. Библиотека поддерживает все уровни.
- Библиотека поддерживает использование JavaAdapter, что невозможно с базовым Rhino.
- Хотя я этого не делал, это должно повысить производительность. (Скомпилированный код работает быстрее, чем интерпретируемый)