我有使用java.beans.Introspector
,java.beans.BeanInfo
和java.beans.PropertyDescriptor
的第三方jar(我无法更改)。
如何在我的Android应用程序中使用该jar?
无法从第3方jar加载类(使用Introspector
):
WARN/dalvikvm(780): VFY: unable to resolve static method 6325: Ljava/beans/Introspector;.getBeanInfo (Ljava/lang/Class;)Ljava/beans/BeanInfo;
WARN/dalvikvm(780): VFY: unable to resolve exception class 962 (Ljava/beans/IntrospectionException;)
WARN/dalvikvm(780): Verifier rejected class Lorg/thirdpartyjar/SomeClass;
答案 0 :(得分:14)
很明显java.beans包在android上并不完整。常见的解决方案是重新打包java.beans和依赖于它们的jar来使用不同的包名而不是java.beans。这正是之前提到的openbeans所做的。并且来自android错误消息的一个有趣的qoute状态:If you find that you cannot do this, then that is an indication that the path you are on will ultimately lead to pain, suffering, grief, and lamentation.
为了避免这种情况,我首先要研究实际使用openbeans的选项,并试图强迫第三方使用它们。根据你的写作,不清楚jar是不是可以改变或不允许改变(你提到两者)。我不知道更换罐子的法律含义,但从技术上讲,它总是可能的,例如,尝试逆向工程类,用aspectj之类的东西做一些构建时间的工具。如果不允许这样做,我认为可以完成运行时检测,例如, dexmaker可以为您的第三方类创建代理,使用java.beans并且您可以重新实现此类的一部分。
还在我看到this的主题上搜索了一下。他们只是使用java.beans包并为android编译它。这对我来说似乎很脆弱,但看起来它正在发挥作用。
不幸的是,这不是一个解决方案,只是我想分享的想法。希望你找到那些有用的。
答案 1 :(得分:9)
唯一的解决方案是维护噩梦:从源头分叉所有第3个聚会罐并重写它们以便他们不使用java.beans。*类(可能将它们替换为openbeans)
然后,每当第三方派对中的一个发布修补程序时(例如针对关键安全性错误),请重新执行 。