Я не знаю решения, но теперь я знаю немного больше о проблеме.
Я создал тривиальное приложение «hello world» со следующим кодом активности:
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView tv = new TextView(this);
try
{
final WebClient webClient = new WebClient( BrowserVersion.FIREFOX_3 );
webClient.setJavaScriptEnabled( false ) ;
final HtmlPage page = webClient.getPage("http://www.google.com");
tv.setText( page.asText().substring( 0, 50 ) );
}
catch( Throwable t )
{
tv.setText(t.getMessage());
}
setContentView(tv);
Я добавил следующие jar-файлы в проект Eclipse:
apache-mime4j-0.6.jar
commons-codec-1.4.jar
commons-collections-3.2.1.jar
commons-io-1.4.jar
commons-lang-2.4.jar
commons-logging-1.1.1.jar
cssparser-0.9.5.jar
htmlunit-2.8.jar
htmlunit-core-js-2.8.jar
httpclient-4.0.1.jar
httpcore-4.0.1.jar
httpmime-4.0.1.jar
nekohtml-1.9.14.jar
sac-1.3.jar
serializer-2.7.1.jar
commons-configuration-1.6.jar
junit-4.5.jar
(И мне пришлось вручную удалить файл License.txt из JUnit jar, иначе проект не будет собран.)
Затем я попытался запустить в симуляторе, используя Android SDK 2.2 и 2.3, и в обоих случаях увидел одно и то же исключение, о котором сообщает OP. (И увидел сообщение об исключении, отображаемое в симуляторе.)
Изменение версии браузера не имеет никакого эффекта, равно как и отключение Javascript. Запрашиваемый URL также не имеет значения, так как исключение выдается при установке WebClient.
Исключение возникает в строке 105 из ClassConfiguration
:
info.setReadMethod(hostClass_.getMethod(GETTER_PREFIX + name, (Class []) null));
Отслеживая это с помощью отладчика, я видел, как hostClass_
прошел через ряд значений (включая com.gargoylesoftware.htmlunit.javascript.host.BoxObject
и com.gargoylesoftware.htmlunit.javascript.host.Attr
) без проблем. Проблемы возникают только тогда, когда они доходят до com.gargoylesoftware.htmlunit.javascript.host.css.CSSImportRule
.
Странно, метод существует:
public String jsxGet_href() {
return getImportRule().getHref();
}
К сожалению, я не смог найти источник для java.lang.Class
, который предоставляет SDK (я нашел источники для других частей SDK, но не JRE), но прошел через слепой код, Я мог видеть немного активности внутри getMethod
, включая вызовы Class.checkPublicMemberAccess
, Class.getClassCache
и ClassCache.getAllPublicMethods
, последний из которых вызывает исключение.
Без источника JRE трудно понять, что именно не работает, но ... Я подозреваю, что какая-то проблема с банкой несовместима. Возможно, файлы JtmlUnit следует перекомпилировать с помощью Android SDK?