Android上的OSGi(Felix):NoClassDefFoundError:sun / reflect / ConstructorAccessorImpl

时间:2012-07-14 10:03:08

标签: android osgi noclassdeffounderror apache-felix

我尝试运行一个显然使用sun.reflect包的包。

首先是一些背景信息:我在 Android 上使用 Apache Felix 。 我还添加了sun.reflect作为系统额外包。

String extrapackets =  "sun.reflect; version=\"1.0.0\"";

config.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA, extrapackets);

config.put("felix.bootdelegation.implicit", "false");

“sun.reflect”也显示在系统包的导出列表中(使用标题cmd)。 它是由我的捆绑导入的。它在导出和导入内容时也得到了正确的版本号。

ERRORMSG:

java.lang.NoClassDefFoundError: sun/reflect/ConstructorAccessorImpl
at sun.misc.Unsafe.defineClass(Native Method)
at sun.reflect.ClassDefiner.defineClass(ClassDefiner.java:45)
at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:381)
at java.security.AccessController.doPrivileged(Native Method)
at sun.reflect.MethodAccessorGenerator.generate(MethodAccessorGenerator.java:377)
at sun.reflect.MethodAccessorGenerator.generateConstructor(MethodAccessorGenerator.java:76)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:30)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
...

3 个答案:

答案 0 :(得分:1)

如果其他人遇到此问题,可能会有更快的解决方法。

我在Sun / Oracle JVM上运行的OSGi中使用反射时遇到了这个错误。结果是this is a known issue。在JVM级别设置-Dsun.reflect.noInflation=true的建议修复将导致不引用该类,代价是忽略优化。

我尝试了修复,它对我有用。

答案 1 :(得分:0)

据我所知,sun。*包是您在计算机上安装的Oracle JVM中使用的内部包。另一方面,Android不使用Sun的(现在的Oracle)JVM实现。 Android提供类似于Java SE的API,但它有自己的VM实现(称为Dalvik VM)。

所以,你不会在Android上找到sun。*包。您需要获取所使用的包的源代码,并针对Android库(使用eclipse中的Android项目或使用Ant)进行编译。然后,将它重新打包到一个jar中,然后你就可以在不引用sun。* packages的情况下进行部署。

卡尔蒂克

答案 2 :(得分:0)

您是否还导入捆绑包?只是将它添加到您的systembundles.extra是不够的。