从 Java 调用 AllJoyn 属性 导致 AnnotationBusException

Calling an AllJoyn property from Java causes a 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();

我不断收到以下异常:

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.$change of class com.wolfecomputerservices.cumulus.ui.Android.Communication.AllJoyn.Objects.ServerData does not annotate position 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: at org.alljoyn.bus.Signature.classTypeSig(Signature.java:170) 04-07 10:11:45.592 26005-26005/com.wolfecomputerservices.cumulus W/System.err: at org.alljoyn.bus.Signature.typeSig(Signature.java:117) 04-07 10:11:45.592 26005-26005/com.wolfecomputerservices.cumulus W/System.err: at org.alljoyn.bus.InterfaceDescription.getOutSig(InterfaceDescription.java:511) 04-07 10:11:45.592 26005-26005/com.wolfecomputerservices.cumulus W/System.err: at org.alljoyn.bus.InterfaceDescription.addMembers(InterfaceDescription.java:386) 04-07 10:11:45.592 26005-26005/com.wolfecomputerservices.cumulus W/System.err: at 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: at org.alljoyn.bus.ProxyBusObject.getProperty(Native Method) 04-07 10:11:45.592 26005-26005/com.wolfecomputerservices.cumulus W/System.err: at org.alljoyn.bus.ProxyBusObject.access0(ProxyBusObject.java:35) 04-07 10:11:45.592 26005-26005/com.wolfecomputerservices.cumulus W/System.err: at org.alljoyn.bus.ProxyBusObject$Handler.invoke(ProxyBusObject.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: at $Proxy4.getServerRunning(Unknown Source) 04-07 10:11:45.592 26005-26005/com.wolfecomputerservices.cumulus W/System.err: at 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: at 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: at 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: at android.os.Handler.dispatchMessage(Handler.java:111) 04-07 10:11:45.593 26005-26005/com.wolfecomputerservices.cumulus W/System.err: at android.os.Looper.loop(Looper.java:194) 04-07 10:11:45.593 26005-26005/com.wolfecomputerservices.cumulus W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5567) 04-07 10:11:45.593 26005-26005/com.wolfecomputerservices.cumulus W/System.err: at java.lang.reflect.Method.invoke(Native Method) 04-07 10:11:45.593 26005-26005/com.wolfecomputerservices.cumulus W/System.err: at java.lang.reflect.Method.invoke(Method.java:372) 04-07 10:11:45.593 26005-26005/com.wolfecomputerservices.cumulus W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:955) 04-07 10:11:45.593 26005-26005/com.wolfecomputerservices.cumulus W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:750)

Note: I do have a method that has a return value of ServerData. However, that is not what I'm calling when this error occurs. I sucessfully make that call long before trying to call the method. It is the method call that causes this exception. However, I do have ServerData annotated with @Position(x) for each field number 0-4.

我做错了什么?

更新:

来自 C++ 提供程序的服务器数据

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

来自 Java 消费者:

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 的版本。我目前在 2.3.1;切换到 2.1.3 会在构建期间导致以下错误(我已经尝试了列出的所有建议):

不幸的是,我似乎无法切换 gradle 的版本。我目前在 2.3.1;切换到 2.1.3 会导致构建期间出现以下错误: Error:org.gradle.api.internal.tasks.DefaultTaskInputs$TaskInputUnionFileCollection 无法转换为 org.gradle.api.internal.file.collections.DefaultConfigurableFileCollection 此意外错误的可能原因包括:

在损坏的 Gradle 进程的情况下,您还可以尝试关闭 IDE 然后杀死所有 Java 进程.

确保有问题的 ServerData 字段是 public 并且您在每个 public 字段之前指定的任何 @Position(n) 注释中没有拼写错误。


更新:

我在使用 gradle 2.2.3 在 Android Studio 中构建时看到了这个注释错误消息。但是,当我返回使用 gradle 2.1.3 时,注释错误消失了。

检查您的顶级 build.gradle 文件。将其类路径依赖项更新为...

dependencies { classpath 'com.android.tools.build:gradle:2.1.3' }


更新 2:

如果您需要在 Android Studio 中构建 gradle > 2.1.3,另一种解决方法是禁用 Android Studio 的 "instant run" 功能。即时 运行 功能自动将两个 public 静态字段添加到 类(即添加 $change 字段和 serialVersionUID 字段)。

AllJoyn java-binding 对 Position 注释的处理(通过反射完成)目前不考虑编译器添加的这两个字段。这将由 AllJoyn 在其即将发布的 16.10a 维护版本中更好地处理。

要禁用 "instant run",请在 Android Studio 中执行以下操作...

Open the Settings or Preferences dialog.
Navigate to Build, Execution, Deployment > Instant Run.
Uncheck the "Enable Instant Run to hot swap/resource changes on deploy" checkbox.