Вызов свойства AllJoyn из Java вызывает исключение AnnotationBusException.

Я борюсь с использованием свойств в AllJoyn. Я новичок в AllJoyn, но не в программировании. У меня есть провайдер, написанный на C++, и я добавляю свои свойства, используя

status = m_Description->AddProperty("ServerName", "s", 1)

После этого статус звонка становится равным ER_OK.

Я определяю свое свойство Java в интерфейсе следующим образом:

 @BusProperty(annotation = BusProperty.ANNOTATE_EMIT_CHANGED_SIGNAL)
 String getServerName() throws BusException;

Однако, когда я пытаюсь использовать это свойство в Java (Android с использованием Android Studio), вызывая его как:

String str = proxyInterface.getServerName();

Я продолжаю получать следующее исключение:

Примечание. У меня есть метод, возвращающий значение ServerData. Однако это не то, что я вызываю, когда возникает эта ошибка. Я успешно делаю этот вызов задолго до того, как пытаюсь вызвать метод. Именно вызов метода вызывает это исключение. Однако у меня есть ServerData с аннотацией @Position(x) для каждого поля с номерами 0-4.

Что я делаю не так?

Обновлять:

ServerData от поставщика C++

От потребителя Java:

class ServerData {
    public:
        const char* Id;
        const char* Name;
        const char* Version;
        const char* MachineName;
        const char* BaseUrl;
    };

ОБНОВЛЕНИЕ: К сожалению, мне не представляется возможным переключить версию gradle. Я сейчас на 2.3.1; переход на 2.1.3 вызывает следующую ошибку во время сборки (я пробовал все перечисленные предложения):

public class ServerData {
    @Position(0)
    @Signature("s")
    public String Id;

    @Position(1)
    @Signature("s")
    public String Name;

    @Position(2)
    @Signature("s")
    public String Version;

    @Position(3)
    @Signature("s")
    public String MachineName;

    @Position(4)
    @Signature("s")
    public String BaseURL;
}

Кэш зависимостей Gradle может быть поврежден (иногда это происходит после истечения времени ожидания сетевого подключения). Повторно загрузите зависимости и проект синхронизации (требуется сеть)

Unfortunately, that doesn't seem possible for me to switch version of gradle. I'm currently on 2.3.1; switching to 2.1.3 causes the following error during build: Error:org.gradle.api.internal.tasks.DefaultTaskInputs$TaskInputUnionFileCollection cannot be cast to org.gradle.api.internal.file.collections.DefaultConfigurableFileCollection Possible causes for this unexpected error include:

  • Состояние процесса сборки Gradle (демона) может быть повреждено. Остановка всех демонов Gradle может решить эту проблему. Остановить процессы сборки Gradle (требуется перезагрузка)
  • В вашем проекте может использоваться сторонний плагин, который несовместим с другими плагинами в проекте или версией Gradle, запрошенной проектом.
  • Убедитесь, что рассматриваемые поля ServerData являются общедоступными и что нет опечаток ни в одной из аннотаций @Position(n), которые вы указали непосредственно перед каждым общедоступным полем.
In the case of corrupt Gradle processes, you can also try closing the IDE and then killing all Java processes.


person Ed Wolfe    schedule 07.04.2017    source источник


Ответы (1)



ОБНОВЛЕНИЕ:

Я видел это сообщение об ошибке аннотации при сборке в Android Studio с gradle 2.2.3. Однако, когда я вернулся к использованию gradle 2.1.3, ошибка аннотации исчезла.

Проверьте файл build.gradle верхнего уровня. Обновите его зависимость от пути к классам, чтобы она была...

зависимости { путь к классам 'com.android.tools.build:gradle:2.1.3'}


ОБНОВЛЕНИЕ 2:

Другой обходной путь, если вам нужно собрать Android Studio с gradle> 2.1.3, — отключить функцию «мгновенного запуска» Android Studio. Функция мгновенного запуска автоматически добавляет в классы два статических поля public (т. е. добавляет поле $change и поле serialVersionUID).

Обработка привязки java AllJoyn к аннотациям Position (которая выполняется посредством отражения) в настоящее время не учитывает эти два поля, добавляемые компилятором. AllJoyn справится с этим лучше в предстоящем отладочном выпуске 16.10a).

Чтобы отключить «мгновенный запуск», выполните следующие действия в Android Studio...

Откройте диалоговое окно «Параметры» или «Настройки».
Выберите «Сборка, выполнение, развертывание» > «Мгновенный запуск».
Снимите флажок «Включить мгновенный запуск для горячей замены/изменения ресурсов при развертывании».

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

person P. Sigurdson    schedule 15.04.2017
comment
Можете ли вы предоставить определение интерфейса и определение ServerData с аннотациями шины alljoyn? - person Ed Wolfe; 16.04.2017
comment
Вы можете посмотреть пример свойств Android (cgit.allseenalliance.org/core/alljoyn.git/tree/alljoyn_java/). В то время как образец контактов имеет класс данных, который использует аннотацию @Position. - person P. Sigurdson; 16.04.2017
comment
Я обновил исходный вопрос с помощью ServerData. Я просмотрел примеры свойств; однако ни один из них (которые я могу найти) не показывает, как иметь поставщика C++ и потребителя Java. Кроме того, я повторяю, если я оставлю ServerData без изменений и просто удалю вызов свойства (которое не использует ServerData), я не получаю ошибку. Может кто-нибудь объяснить мне, почему он будет жаловаться на ServerData при вызове свойства, когда он его не использует; а по методу что делает, ошибки нет? - person P. Sigurdson; 16.04.2017
comment
@Ed, я обновил свой ответ проверенным решением. Я получил ту же ошибку, о которой вы говорите, когда тестировал образец AllJoyn Contacts на Android (построен в Android Studio с gradle 2.2.3). Когда я вернулся от сборки с gradle 2.2.3 к использованию более старой версии 2.1.3, ошибка аннотации исчезла. Gradle 2.2 добавил кое-что, связанное с обработкой аннотаций, возможно, это имеет какой-то плохой побочный эффект для аннотаций Java, касающихся того, как обрабатывается аннотация шины alljoyn Position. - person Ed Wolfe; 18.04.2017
comment
@Ed, я снова обновил свой ответ, добавив информацию о том, как функция мгновенного запуска Android Studio может вызвать ошибку, с которой вы столкнулись, и как отключить мгновенный запуск. Я убедился, что это решение работает с образцом AllJoyn Contacts на Android. - person P. Sigurdson; 18.04.2017
comment
Это решило проблему. Благодарю вас! Я знаю, что появится еще одна ошибка, но я создам новую тему для нее. - person P. Sigurdson; 18.04.2017
comment
04-07 10:11:45.592 26005-26005/com.wolfecomputerservices.cumulus W/System.err: org.alljoyn.bus.AnnotationBusException: field public static transient volatile com.android.tools.fd.runtime.IncrementalChange com.wolfecomputerservices .cumulus.ui.Android.Communication.AllJoyn.Objects.ServerData.$изменение класса com.wolfecomputerservices.cumulus.ui.Android.Communication.AllJoyn.Objects.ServerData не аннотирует позицию 04-07 10:11:45.592 26005- 26005/com.wolfecomputerservices.cumulus W/System.err: at org.alljoyn.bus.Signature.structTypes(Signature.java:71) 04-07 10:11:45.592 26005-26005/com.wolfecomputerservices.cumulus W/System .err: на org.alljoyn.bus.Signature.classTypeSig(Signature.java:170) 04-07 10:11:45.592 26005-26005/com.wolfecomputerservices.cumulus W/System.err: на org.alljoyn.bus. Signature.typeSig(Signature.java:117) 04-07 10:11:45.592 26005-26005/com.wolfecomputerservices.cumulus W/System.err: в org.alljoyn.bus.InterfaceDesc ription.getOutSig(InterfaceDescription.java:511) 04-07 10:11:45.592 26005-26005/com.wolfecomputerservices.cumulus W/System.err: в org.alljoyn.bus.InterfaceDescription.addMembers(InterfaceDescription.java:386) 04-07 10:11:45.592 26005-26005/com.wolfecomputerservices.cumulus W/System.err: в org.alljoyn.bus.InterfaceDescription.create(InterfaceDescription.java:199) 04-07 10:11:45.592 26005- 26005/com.wolfecomputerservices.cumulus W/System.err: at org.alljoyn.bus.ProxyBusObject.addInterface(ProxyBusObject.java:115) 04-07 10:11:45.592 26005-26005/com.wolfecomputerservices.cumulus W/System .err: в org.alljoyn.bus.ProxyBusObject.getProperty (собственный метод) 04-07 10:11:45.592 26005-26005/com.wolfecomputerservices.cumulus W/System.err: в org.alljoyn.bus.ProxyBusObject.access $400(ProxyBusObject.java:35) 04-07 10:11:45.592 26005-26005/com.wolfecomputerservices.cumulus W/System.err: at org.alljoyn.bus.ProxyBusObject$Handler.invoke(ProxyBus Object.java:274) 04-07 10:11:45.592 26005-26005/com.wolfecomputerservices.cumulus W/System.err: at java.lang.reflect.Proxy.invoke(Proxy.java:397) 04-07 10 :11:45.592 26005-26005/com.wolfecomputerservices.cumulus W/System.err: в $Proxy4.getServerRunning(неизвестный источник) 04-07 10:11:45.592 26005-26005/com.wolfecomputerservices.cumulus W/System.err : на com.wolfecomputerservices.cumulus.ui.Android.Communication.AllJoyn.Interfaces.ICumulusImpl.IsRunning(ICumulusImpl.java:24) 04–07 10:11:45. 593 26005-26005/com.wolfecomputerservices.cumulus W/System.err: в com.wolfecomputerservices.cumulus.ui.Android.Communication.AllJoyn.Handlers.BusHandler.processMessage(BusHandler.java:276) 04–07 10:11: 45,593 26005-26005/com.wolfecomputerservices.cumulus W/System.err: в com.wolfecomputerservices.cumulus.ui.Android.Abstracts.PauseHandler.handleMessage(PauseHandler.java:75) 04-07 10:11:45.593 26005-26005 /com.wolfecomputerservices.cumulus W/System.err: в android.os.Handler.dispatchMessage(Handler.java:111) 04-07 10:11:45.593 26005-26005/com.wolfecomputerservices.cumulus W/System.err: в android.os.Looper.loop(Looper.java:194) 04-07 10:11:45.593 26005-26005/com.wolfecomputerservices.cumulus W/System.err: в android.app.ActivityThread.main(ActivityThread.java :5567) 04-07 10:11:45.593 26005-26005/com.wolfecomputerservices.cumulus W/System.err: в java.lang.reflect.Method.invoke(собственный метод) 04-07 10:11:45.593 26005- 26005/com.wolfeco mputerservices.cumulus W/System.err: в java.lang.reflect.Method.invoke(Method.java:372) 04-07 10:11:45.593 26005-26005/com.wolfecomputerservices.cumulus W/System.err: в com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:955) 04-07 10:11:45.593 26005-26005/com.wolfecomputerservices.cumulus W/System.err: на com.android.internal. os.ZygoteInit.main(ZygoteInit.java:750) - person Ed Wolfe; 19.04.2017