хорошо, у меня есть вопрос об переопределении. Мне нужно переопределить один метод из библиотеки Cling UPnP. Поэтому я расширил класс обслуживания и написал следующий код:
public class UpnpBrowseService extends AndroidUpnpServiceImpl
{
@Override
protected AndroidUpnpServiceConfiguration createConfiguration(WifiManager wifiManager)
{
return new AndroidUpnpServiceConfiguration(wifiManager)
{
@Override
public StreamClient createStreamClient()
{
return new StreamClientImpl(new StreamClientConfigurationImpl() {
public int getConnectionTimeoutSeconds() {
return 2;
}
public int getDataReadTimeoutSeconds() {
return 3;
}
public boolean getStaleCheckingEnabled() {
// comment from AndroidHttpClient.java:
//
// Turn off stale checking. Our connections break all the time anyway,
// and it not worth it to pay the penalty of checking every time.
return false;
}
public int getRequestRetryCount() {
// since "connections break all the time anyway", limit number of retries to
// minimize time spent in HttpClient.execute()
return 1;
}
});
}
};
}
}
Для целей тестирования метод createStreamClient() теперь тот же, что и в родительском классе. Исходный код родительского класса находится здесь.
Если я прокомментирую этот метод, это нормально и работает. Но если я использую мой метод overriden, я получаю NoClassDefFoundError:
12-14 09:52:12.110: E/AndroidRuntime(20784): FATAL EXCEPTION: Thread 18 (Active: 6)
12-14 09:52:12.110: E/AndroidRuntime(20784): java.lang.NoClassDefFoundError: org.teleal.cling.transport.impl.StreamClientImpl$1$1
12-14 09:52:12.110: E/AndroidRuntime(20784): at org.teleal.cling.transport.impl.StreamClientImpl$1.createURLStreamHandler(StreamClientImpl.java:77)
12-14 09:52:12.110: E/AndroidRuntime(20784): at java.net.URL.setupStreamHandler(URL.java:551)
12-14 09:52:12.110: E/AndroidRuntime(20784): at java.net.URL.<init>(URL.java:286)
12-14 09:52:12.110: E/AndroidRuntime(20784): at java.net.URL.<init>(URL.java:157)
12-14 09:52:12.110: E/AndroidRuntime(20784): at org.teleal.cling.model.message.header.LocationHeader.setString(LocationHeader.java:45)
12-14 09:52:12.110: E/AndroidRuntime(20784): at org.teleal.cling.model.message.header.UpnpHeader.newInstance(UpnpHeader.java:171)
12-14 09:52:12.110: E/AndroidRuntime(20784): at org.teleal.cling.model.message.UpnpHeaders.parseHeaders(UpnpHeaders.java:68)
12-14 09:52:12.110: E/AndroidRuntime(20784): at org.teleal.cling.model.message.UpnpHeaders.getAsArray(UpnpHeaders.java:136)
12-14 09:52:12.110: E/AndroidRuntime(20784): at org.teleal.cling.model.message.UpnpHeaders.getFirstHeader(UpnpHeaders.java:143)
12-14 09:52:12.110: E/AndroidRuntime(20784): at org.teleal.cling.model.message.discovery.IncomingSearchResponse.isSearchResponseMessage(IncomingSearchResponse.java:46)
12-14 09:52:12.110: E/AndroidRuntime(20784): at org.teleal.cling.protocol.async.ReceivingSearchResponse.execute(ReceivingSearchResponse.java:54)
12-14 09:52:12.110: E/AndroidRuntime(20784): at org.teleal.cling.protocol.ReceivingAsync.run(ReceivingAsync.java:64)
12-14 09:52:12.110: E/AndroidRuntime(20784): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
12-14 09:52:12.110: E/AndroidRuntime(20784): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
12-14 09:52:12.110: E/AndroidRuntime(20784): at java.lang.Thread.run(Thread.java:1019)
Я немного новичок в решении такого рода NoClassDefFoundError, и я понятия не имею, что с ним делать. Интересно, можете ли вы помочь мне с этим или хотя бы направить меня к методу определения причины этой проблемы.
Я только выяснил, что это исключение возникает, когда есть некоторый сбой в статических элементах, но у этого класса их нет.
Большое спасибо!
JVM жалуется, что не может найти org.teleal.cling.transport.impl.StreamClientImpl$1$1
- это анонимный экземпляр import sun.net.www.protocol.http.Handler
- см. Здесь в строке 77,
Поэтому, вероятно, у вас нет этого пакета солнца, установленного на вашем компьютере. Но зачем вам это нужно, когда вы этого не делали раньше.
Однако, я думаю, что это может быть проблема, связанная с пакетом. Точки StackTrace в виде StreamClientImpl
класса в org.teleal.cling.transport.impl
пакете, в то время как исходный код, который вы ссылаетесь на ввозится StreamClientImpl
класса из другой упаковки - org.teleal.cling.transport.impl.apache
(примечание дополнительный пакет Apache в конце).
Вам нужно разобраться, какой StreamClientImpl
вы действительно хотите (возможно, тот, который находится в пакете apache).
Я думаю, что проблема в том, что не найти класс StreamClientImpl, помните, что имя класса - это каталоги и подкаталоги, где это так, поэтому имя вашего класса, которое вы не можете найти, - org.teleal.cling.transport.impl. StreamClientImpl, я не знаю класс, я предполагаю его в библиотеку.
Помните, что если вы экспортируете proyect и имеете свой.class или.jar, каталоги ваших кланов должны быть такими же, как имя класса, поэтому вы должны иметь StreamClientImpl в папке, например org/teleal/cling/transport/impl/StreamClientImpl.
Надеюсь, это может помочь вам...
У меня была такая же проблема, как у вас, и я решил импортировать библиотеку "teleal-common-1.0.13.jar", и проблема была решена.
Я использую старую библиотеку cling-core-1.0.5.jar. Возможно, если вы используете новую версию библиотеки, возможно, вам понадобится также импортировать новую библиотеку, дополненную цифрами.
Кстати, я использую эту библиотеку в приложении для Android.
То есть, надеюсь быть полезным.
Используйте эти классы для импорта:
org.fourthline.cling.transport.impl.apache.StreamClientConfigurationImpl
org.fourthline.cling.transport.impl.apache.StreamClientImpl
org.fourthline.cling.transport.spi.StreamClient
я думаю, это поможет