Я пытаюсь использовать javax.xml.parsers.DocumentBuilderFactory в коде Delphi через JNI/Java Bridge.
Это интерфейс, который я построил для завода:
Примечание. Я знаю, что в классе фактический метод создания - newInstance(), но когда я пытаюсь использовать newInstance вместо init, я также получаю ту же ошибку сегментации.
{DocumentBuilderFactory}
JDocumentBuilderFactoryClass = interface(JObjectClass)
['{8475A5A9-F10A-4DDA-9D50-C714C015C81C}']
function init: JDocumentBuilderFactory; cdecl; overload;
end;
[JavaSignature('javax/xml/parsers/DocumentBuilderFactory')]
JDocumentBuilderFactory = interface(JObject)
['{7F4F2927-25EB-4B03-9373-A43B0757CD06}']
function newDocumentBuilder: JDocumentBuilder; cdecl;
end;
TJDocumentBuilderFactory = class
(TJavaGenericImport<JDocumentBuilderFactoryClass, JDocumentBuilderFactory>)
end;
И это код, вызывающий интерфейс/объект: tmpObject: JObject;
// init an object, i have already tried just calling create
tmpObject := TJDocumentBuilderFactory.JavaClass.init;
//then wrap it into the appropriate object
if Assigned(tmpObject) then
builderFactory := TJDocumentBuilderFactory.Wrap
((tmpObject as IlocalObject).GetObjectID);
Насколько я знаю, мне не нужно объявлять каждый метод класса java в интерфейсе, я без проблем использовал другие классы.
Обычно ошибки сегментации, вызванные мостом java, указывают на то, что проблема связана с загрузкой интерфейса или файла. Например, если путь к java-классу в java-сигнатуре неверен, это также приведет к ошибке сегментации. Однако это не так, потому что я могу подтвердить, что путь правильный. Я огляделся, но я не могу найти никаких предложений относительно того, как решить эту проблему. Есть идеи?
С уважением,
Джейсон
Ошибка сегментации понятна, потому что невозможно создать экземпляры абстрактных классов.
В документации на Android говорится, что DocumentBuilderFactory является абстрактным классом. Класс предоставляет статический метод newDocumentBuilder(), который возвращает новый экземпляр DocumentBuilder.
Чтобы создать экземпляр фабрики, используйте DocumentBuilderFactory. newInstance().
Поскольку я не работаю с мобильным изданием Delphi, я не могу сказать, как статический заводский метод можно использовать над адаптером JNI. Если это не задокументировано, возможно, это стоит своего вопроса Stackoverflow.
builder = builderFactory.newDocumentBuilder();
document = builder.parse("input.xml");
после создания builderFactory. Смотрите этот пост