例如,可以编译OS 6.0的应用程序并在5.0设备上运行它,只要你不使用更新的API就可以了(我刚刚在2分钟前做过测试确保)。
我正在使用带有最后一个BB插件的eclipse 3.6来开发一个应用程序,我们需要在可用时使用条形码扫描(API 6.0及更高版本)。在较低版本中,最干净的解决方案是不加载冲突类。如果这是Java SE我已经在类中封装了条形码API的所有用法(让我们称之为OS6Impl
),还创建了一个默认的OS5Impl
,并且我已经实例化了一个或另一个在运行时使用反射,具体取决于设备的操作系统级别。
但这是BB,这还不够,所以我们不得不求助于预处理器指令并管理2个不同版本的应用程序。如果预处理程序标志禁用了新的API功能,则会删除生成的预处理OS6Impl.java
文件的所有内容。我可以通过查看.preprocessed
文件夹中的文件来看到这一点,并打开生成的jar文件,其中不存在OS6Impl.class
文件。当flags启用新功能时,OS6Impl.java
文件中包含代码,而OS6Impl.class
文件包含在jar中。
这没关系,应该适用于使用JRE 6编译两个版本的OS5和OS6设备。但事实并非如此。预处理没问题,该类不包含在jar中(因此它不应该在cod中),但是当我们在5.0设备中运行它时,它会显示一条错误消息(“找不到模块”)。该模块是“net_rim_barcodescanner”,我们打算仅在6.0以上的设备中扫描条形码。
我必须为JRE 5.0编译以消除错误。这是荒谬的,因为编译为6.0的代码不使用较新的API能够在我之前说过的较低版本中运行。我已多次验证除了OS6Impl.java
类之外没有使用新的API的导入,预处理器指令设置正确,并且在每个预处理器指令更改后完成了清理和构建。安装每个鳕鱼后,还重新启动了黑莓。
现在要编译一个或另一个版本,我们不仅要修改app描述符中的指令,还要修改构建路径以将JRE切换为5或6。
使用预处理程序指令去除不兼容的代码时会添加什么样的依赖项?在没有预处理程序指令的情况下编译兼容代码时,为什么不添加这些依赖项?预处理器不是在编译器之前运行的吗?
答案 0 :(得分:1)
不,虽然某些程序可能有效,但并不能保证所有程序都能正常工作。原因与java拒绝加载使用更高版本JDK编译的类的原因相同。
让我解释一下。随着版本的每次更改,还会添加一些新的操作码和VM常量。这些操作码控制类文件的生成,而其他常量用于生成的cod文件。如果更高版本的编译器在生成cod时生成任何这些操作码/常量,则较低的运行时将无法理解它们。
要了解这些差异,请查看JDK bin目录中JDWP.jar的net.rim.ide.core.VMConst
类。虽然5.0和6.0之间没有操作码差异,但是添加了一些新的VM常量。在7.0中,添加了两个新的操作码。
因此,有可能5.0运行时无法理解通过6.0编译生成的cod。
如何针对不同的操作系统进行编译:
将Ant与BB Ant Tools一起使用。然后,您可以使用不同的JDK创建多个目标,只需单击一下即可编译。为不同的屏幕尺寸创建不同的构建目标也变得非常容易,以减小生成的cod文件的大小。