2

我正在尝试#ifdef在 Eclipse 的 Android 项目中使用预处理器。我对这个主题做了一些研究,发现了这个链接:Java Preprocessing Using Eclipse,它可能让我在 Android 项目中使用预处理器。

但是,在我尝试构建项目后,它声称package android.*不存在类似的东西。因此,找不到任何 android API。

那么,我应该如何在构建路径中添加这些库?实际上,android.jar 文件已经在 J​​ava 构建路径下。为什么 Eclipse 仍然声称?

有没有其他方法可以让我在 Eclipse 内置的 Android 项目中使用预处理器?

4

1 回答 1

3

您正在使用 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 之前的设备上使用的应用程序时,一切都按预期工作。

于 2012-05-26T04:26:35.800 回答