19

我有 3rd 方 jar(我无法更改),它使用java.beans.Introspector,java.beans.BeanInfojava.beans.PropertyDescriptor.

如何在我的 android 应用程序中使用该 jar?

Introspector它无法从第 3 方 jar加载类(使用):

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;
4

2 回答 2

18

很明显 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 的选项并尝试强制第 3 方使用这些选项。从您所写的内容来看,尚不清楚 jar 是不能更改还是不允许更改(您提到两者)。我不知道更改 jar 的法律含义,但从技术上讲,总是有可能的,例如尝试逆向工程类,使用 aspectj 之类的东西进行一些构建时间检测。如果不允许这样做,我认为可以进行运行时检测,例如dexmaker可以为使用 java.beans 的第三方类创建代理,并且您可以重新实现该类的一部分。

还用谷歌搜索了我看到的这个主题。他们只是使用 java.beans 包并为 android 编译它。这对我来说似乎很脆弱,但看起来它正在工作。

不幸的是,这不是解决方案,只是我想分享的想法。希望你觉得这些有用。

于 2013-03-03T11:15:44.213 回答
11

唯一的解决方案是维护噩梦:从源代码分叉所有 3th 方 jar 并重写它们,这样它们就不会使用 java.beans.* 类(可能通过将它们替换为 openbeans)。

然后,每次这些第 3 方 jar 中的一个发布修补程序(例如针对严重的安全错误)时,重新执行此操作。

于 2013-03-05T14:38:34.197 回答