Я улучшаю клиента, который является частью более крупного проекта. Из-за нехватки скорости я был вынужден переключиться на CNI, и поэтому мне пришлось генерировать собственный код с помощью компилятора GNU-gcj (gnu 4.6.3).
Компиляция и компоновка работают нормально (благодаря флагу -findirect-dispatch), и у меня нет проблем с выполнением вывода. Но когда дело доходит до связи между клиентом и сервером, клиент сразу отключается. Причина:
[XStreamClient Reader] ПРЕДУПРЕЖДЕНИЕ. Клиент отключен (Исключение: com.thoughtworks.xstream.io.StreamException: невозможно создать XmlPullParser)
(Это исключение появляется только в версии клиента, скомпилированной gcj. Когда я запускаю код с помощью интерпретатора java, все работает хорошо (но слишком медленно ^^)) --> Сложность заключается в том, что я не могу получить исходный код. код, в котором возникает это исключение, потому что он находится в предварительно скомпилированной (файлы классов Java) библиотеке, которую использует клиент. (И я не могу связаться с автором той библиотеки)
Я предполагаю, что библиотека вызывает XppReader, который затем пытается создать класс XmlPullParser и терпит неудачу.
Я привязываю библиотеку XStream (версия 1.4.3) (и другие необходимые файлы *.jars), распаковывая их и компилируя созданные файлы *.class, а затем связывая объектные файлы. Похоже, это работает и для всех других библиотек. (Моя ОС=Убунту)
Что я уже сделал, чтобы решить эту проблему: я интенсивно гуглил XStream/XmlPullParser и gcj и заменил файлы xmlpull и kxml2 другими версиями. Но ничего не сработало. Кто-нибудь из вас знает, что может быть решением?
РЕДАКТИРОВАТЬ:
Я выяснил, что причина сбоя создания XmlPullParser заключается в том, что каталог META-INF с файлом /services/org.xmlpull.v1.XmlPullParserFactory не может быть найден функцией XmlPullParserFactory.newInstance. Это связано с тем, что я скомпилировал и связал только файлы *.jar *.class. Итак, как только я нашел способ связать каталог META-INF с исполняемым файлом, чтобы функция могла найти и получить к нему доступ, проблема должна быть решена. Кто-нибудь из вас уже знает, как это сделать?