gpt4 book ai didi

java - 在 Eclipse 中的 Android 项目中使用预处理器

转载 作者:搜寻专家 更新时间:2023-11-01 09:07:38 27 4
gpt4 key购买 nike

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

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

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

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

最佳答案

您正在使用 Java 而不是 C/C++ 进行编程。 Android 开发不需要使用预处理器。


编辑:

My problem is we developed an Android app with USB functionality which is supported only by Android 3.1+. So, some of the USB libraries are imported, what I want is those imported libraries could be commented out using #ifdef, if we could, when we build the project for Android 2.2 or 2.3, etc. Is there any other workaround for this?

要使用您提到的类/方法,您必须针对 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:

作为对比尔评论的回应,内容如下:

Thank you, Alex. I built my project agaist 3.1, deployed it on 2.2 and run it. One last thing I am not quite sure I understand is I could debug the part of the code referred by the Android 3.1 on the Android 2.2 OS. Here is my explanation: after being built against 3.1, Java code is converted to machine code and HONEYCOMB_MR1 is just an integer although HONEYCOMB_MR1 is not present in 2.2, when I debugged it, the debugger goes to the line of HONEYCOMB_MR1, fetches that integer and compares with SDK_INT. In this way, the code could still be debugged although HONEYCOMB_MR1 is only in 3.1 SDK. Is that correct? Thanks.

我认为你理解正确。更准确的推理是 HONEYCOMB_MR1 被标记为 static final。由于该变量是一个不可变常量(即它的值永远不会改变),因此当您编译 .apk 时,该整数被硬编码到字节码中。因此,当您的 2.2 设备到达 if 语句时,它会检查是否 12 > 8,从而避免(失败的)运行时搜索 HONEYCOMB_MR1.

在开发 Android 应用程序时,这种事情实际上经常发生。例如,此行为还解释了为什么可以使用 MATCH_PARENT (在 2.2 中引入)在“技术上”应该只支持 FILL_PARENT 的设备上.两个常量的值都是 -1;因此,当您在 Froyo 之前的设备上运行使用 MATCH_PARENT 的应用时,一切都会按预期运行。

关于java - 在 Eclipse 中的 Android 项目中使用预处理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10746436/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com