您正在使用 Java 编程,而不是 C/C++。Android 开发不需要使用预处理器。
编辑:
我的问题是我们开发了一个只有 Android 3.1+ 支持的带有 USB 功能的 Android 应用程序。因此,导入了一些 USB 库,我想要的是这些导入的库可以使用 注释掉#ifdef
,如果可以的话,当我们为 Android 2.2 或 2.3 等构建项目时。还有其他解决方法吗?
要使用您提到的类/方法,您必须针对 Android SDK 3.1 或更高版本构建您的应用程序。但是,您还必须确保运行 3.0 或更低版本的设备在运行时不使用这些类/方法,因为这样做会导致ClassNotFound
异常。
这里的关键点是您需要在运行时执行这些检查。由于您的应用程序只针对所有设备编译一次,因此预处理器无法阻止此类事件的发生。相反,您需要在代码中明确防止这种情况发生。这通常通过基本if-else
语句来完成。例如,
if (Build.VERSION_CODES.HONEYCOMB_MR1 >= Build.VERSION.SDK_INT) {
// then you are on a device running android 3.1+ and it is
// safe to make use of the new classes/methods
} else {
// otherwise, you are running on a device running android 3.0
// or lower. you should not make use of the new classes/methods.
}
编辑#2:
回应比尔的评论,内容如下:
谢谢你,亚历克斯。我根据 3.1 构建了我的项目,将其部署在 2.2 上并运行它。我不太确定我理解的最后一件事是我可以在 Android 2.2 操作系统上调试 Android 3.1 引用的代码部分。这是我的解释:在针对 3.1 构建之后,Java 代码被转换为机器代码,并且 HONEYCOMB_MR1 只是一个整数,尽管 HONEYCOMB_MR1 在 2.2 中不存在,当我调试它时,调试器转到 HONEYCOMB_MR1 的行,获取该整数并与 SDK_INT 进行比较。这样,虽然 HONEYCOMB_MR1 仅在 3.1 SDK 中,但仍然可以调试代码。那是对的吗?谢谢。
我认为你理解正确。更确切的推理是HONEYCOMB_MR1
标记static final
。由于变量是一个不可变的常量(即它的值永远不会改变),所以当你编译.apk
. 因此,当您的 2.2 设备到达if
语句时,它会检查 if 12 > 8
,从而避免(失败的)运行时搜索HONEYCOMB_MR1
.
当您开发 Android 应用程序时,这种事情实际上经常发生。例如,这种行为也解释了为什么您可以MATCH_PARENT
在“技术上”只支持FILL_PARENT
. 两个常量都有值-1
;因此,当您运行MATCH_PARENT
在 Froyo 之前的设备上使用的应用程序时,一切都按预期工作。