Ошибка сегментации при использовании DocumentBuilderFactory через Java Bridge в Delphi

1

Я пытаюсь использовать 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-сигнатуре неверен, это также приведет к ошибке сегментации. Однако это не так, потому что я могу подтвердить, что путь правильный. Я огляделся, но я не могу найти никаких предложений относительно того, как решить эту проблему. Есть идеи?

С уважением,
Джейсон

  • 0
    Я не уверен. Как бы это проверить? Я хотел сделать что-то вроде: builder = builderFactory.newDocumentBuilder(); document = builder.parse("input.xml"); после создания builderFactory. Смотрите этот пост
Теги:
jni
delphi-xe5

1 ответ

0
Лучший ответ

Ошибка сегментации понятна, потому что невозможно создать экземпляры абстрактных классов.

В документации на Android говорится, что DocumentBuilderFactory является абстрактным классом. Класс предоставляет статический метод newDocumentBuilder(), который возвращает новый экземпляр DocumentBuilder.

Чтобы создать экземпляр фабрики, используйте DocumentBuilderFactory. newInstance().


Поскольку я не работаю с мобильным изданием Delphi, я не могу сказать, как статический заводский метод можно использовать над адаптером JNI. Если это не задокументировано, возможно, это стоит своего вопроса Stackoverflow.

  • 0
    Я подозревал, что это было связано с тем, что класс был абстрактным. Я знаю, что к статическим методам можно получить доступ, поместив новый метод DocumentBuilder в интерфейс JDocumentBuilderFactoryClass, а затем вызвав его так же, как и метод newInstance. Когда я попробовал это, это также привело к ошибке сегментации, хотя. Источник BuilderFactory показывает, что метод newDocuemntBuilder также является абстрактным. это будет причиной этой ошибки сегмента?
  • 0
    Пожалуйста, смотрите примечание в моем первоначальном вопросе. Первоначально я пытался использовать newInstance, но я также пробовал снова с теми же результатами. Нужно ли использовать newInstance (factoryClassName, classLoader)?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню