Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Blackberry Java:预处理器指令don';不要删除依赖项_Java_Eclipse_Blackberry_Preprocessor Directive_Jde - Fatal编程技术网

Blackberry Java:预处理器指令don';不要删除依赖项

Blackberry Java:预处理器指令don';不要删除依赖项,java,eclipse,blackberry,preprocessor-directive,jde,Java,Eclipse,Blackberry,Preprocessor Directive,Jde,例如,可以为OS 6.0编译一个应用程序并在5.0设备上运行,只要不使用较新的API,就可以了(我在2分钟前刚刚做了一个测试,只是为了确保) 我正在使用Eclipse3.6和最后一个BB插件来开发一个应用程序,在这个应用程序中,我们只需要在可用时使用条形码扫描(API6.0和更高版本)。最干净的解决方案是在较低版本中不加载冲突类。如果这是Java SE,我会将条形码API的所有用法封装在一个类中(我们称之为OS6Impl),也会创建一个默认的OS5Impl,并且我会根据设备的操作系统级别在运行时

例如,可以为OS 6.0编译一个应用程序并在5.0设备上运行,只要不使用较新的API,就可以了(我在2分钟前刚刚做了一个测试,只是为了确保)

我正在使用Eclipse3.6和最后一个BB插件来开发一个应用程序,在这个应用程序中,我们只需要在可用时使用条形码扫描(API6.0和更高版本)。最干净的解决方案是在较低版本中不加载冲突类。如果这是Java SE,我会将条形码API的所有用法封装在一个类中(我们称之为
OS6Impl
),也会创建一个默认的
OS5Impl
,并且我会根据设备的操作系统级别在运行时使用反射实例化其中一个

但这是BB,这还不够,所以我们不得不求助于预处理器指令并管理两个不同版本的应用程序。如果预处理器标志禁用了新的API功能,则生成的预处理
OS6Impl.java
文件将从所有内容中删除。我可以通过查看
.preprocessed
文件夹中的文件,并打开生成的jar文件(其中不存在
OS6Impl.class
文件)来看到这一点。当标志启用新特性时,
OS6Impl.java
文件中包含代码,
OS6Impl.class
文件包含在jar中

这没问题,应该可以在OS5和OS6设备上使用JRE 6编译这两个版本。但事实并非如此。预处理是正常的,类不包括在jar中(因此它不应该在cod中),但是当我们在5.0设备中运行它时,它会显示一条错误消息(“找不到模块”)。该模块是“net_rim_条形码扫描仪”,我们打算仅在6.0+设备中使用该模块扫描条形码

我必须为JRE 5.0编译以消除错误。这是荒谬的,因为为6.0编译的代码不使用较新的API,正如我前面所说的,可以在较低版本中运行。我已经多次验证过,除了在
OS6Impl.java
类中,没有使用新API的导入,预处理器指令设置正确,并且在每次预处理器指令更改后都进行了清理和构建。在安装每个cod后,也重新启动blackberry

现在要编译一个或另一个版本,我们不仅要修改应用程序描述符中的指令,还要修改构建路径以将JRE切换到5或6


当使用预处理器指令剥离不兼容代码时,会添加什么样的依赖项?为什么在编译没有预处理器指令的兼容代码时不添加这些依赖项?预处理器不是在编译器之前运行的吗?

不,虽然有些程序可以工作,但不能保证所有程序都能以这种方式工作。原因与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和。然后,您可以创建多个目标,使用不同的JDK在一次单击中进行编译。为不同的屏幕大小创建不同的构建目标也变得非常容易,以减少生成的cod文件的大小。

这不是特定问题的答案,因为我现在不为blackberry平台开发。但是当我还是个孩子的时候,我放弃了eclipse,因为它的奇怪和错误的行为,并且使用了Netbeans++。如果未解决问题,请检查这些工具组合。