Android:从Android上的反射实例化JNDI工厂强制javax

时间:2012-01-19 16:15:12

标签: android reflection jms jndi qpid

我正在尝试将Apache Qpid客户端,JMS和JNDI移植到Android。在传递Dalvik的--core-library参数以允许JMS / JNDI的javax包之后运行ant调试安装目标时,我能够成功编译/构建我的QpidDroid项目。在考虑使用jarjar将javax类重新打包/重构到不同的包命名空间之前,我希望这样做。

我认为这在法律上是合法的,因为我使用的是Oracle网站目前提供的旧/第一个单独的JNDI jar。我正在使用Qpid中的Apache Geronimo附带的JMS jar,但我认为它也可以从Oracle单独下载。我的开发环境使用Android平台2.1和jdk 1.6。

问题是,它似乎无法实例化我的自定义jndi连接工厂:PropertiesFileInitialContextFactory。这是我的QpidDroid项目中的.java源文件(不是libs jar中的.class)(我从qpidClient jar中提取了类)。

有人知道为什么不能在这里实例化吗?我想知道proguard是否会破坏反射,...但我正在使用调试ant任务构建它,所以我认为proguard根本不应该运行。当我在模拟器上运行已安装的应用程序时发生异常。我使用它使用的默认端口在同一台机器上运行Apache Qpid服务。

01-18 18:05:16.966: W/System.err(296): [Root exception is java.lang.ClassNotFoundException: org.apache.qpid.jndi.PropertiesFileInitialContextFactory]javax.naming.NoInitialContextException: Cannot instantiate class: org.apache.qpid.jndi.PropertiesFileInitialContextFactory
01-18 18:05:17.006: W/System.err(296):  at javax.naming.spi.NamingManager.getDefaultInitialContextFactory(NamingManager.java:720)
01-18 18:05:17.006: W/System.err(296):  at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:768)
01-18 18:05:17.016: W/System.err(296):  at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:169)
01-18 18:05:17.016: W/System.err(296):  at javax.naming.InitialContext.<init>(InitialContext.java:146)
01-18 18:05:17.016: W/System.err(296):  at org.rif.QpidDroid.Hello.runTest(Hello.java:56)

感谢您的任何提示!

1 个答案:

答案 0 :(得分:0)

我认为我发现了问题 - Android在版本2.3之前的反射中存在错误

http://code.google.com/p/android/issues/detail?id=6636

我将我的QpidDroid项目移植到Android 2.3,看起来JNDI现在使用QPID连接参数成功创建了InitialContext