0

澄清: 我以前的 Android 开发环境是一台 Win7 机器,它使用命令行构建工具和与 Git 一起安装的 MinGW bash shell。我正在尝试在一台古老的 WinXP 机器上创建一个类似的环境。

原始问题:

我正在为我的 Android 开发环境设置一台旧的 Windows XP 机器。(是的,我知道我希望我有办法购买一台新的 Win7 或更好的 Win8 机器。我正在使用我目前拥有的机器。)我目前的问题是,当我运行我的机器时,ant -f build-android.xml debug我得到了以下错误:

-dex:
      [dex] Found Deleted Target File
      [dex] Converting compiled files and external libraries into c:\devel\src\java\bbct\bin\classes.dex...
       [dx] ************ java_exe=
       [dx] The system cannot find the path specified.
       [dx]
       [dx] ERROR: No suitable Java found. In order to properly use the Android Developer
       [dx] Tools, you need a suitable version of Java JDK installed on your system.
       [dx] We recommend that you install the JDK version of JavaSE, available here:
       [dx]   http://www.oracle.com/technetwork/java/javase/downloads
       [dx]
       [dx] You can find the complete Android SDK requirements here:
       [dx]   http://developer.android.com/sdk/requirements.html
       [dx]

通过一些侦探工作,我发现-dex目标运行,而目标运行${android.platform.tools.dir}/dx${bat}又运行其中的..\tools\lib\find_java.bat一部分,如下所示:

rem Useful links:
rem Command-line reference:
rem   http://technet.microsoft.com/en-us/library/bb490890.aspx

rem Check we have a valid Java.exe in the path. The return code will
rem be 0 if the command worked or 1 if the exec failed (program not found).
for /f %%a in ('%~dps0\find_java.exe -s') do set java_exe=%%a
if not defined java_exe goto :CheckFailed

find_java.exe -s从命令行运行给出

c:/PROGRA~1/Java/JDK16~1.0_3\bin\java.exe

这是我的 JDK 安装的正确位置。for但是,当我在上述批处理脚本片段中的and命令之间添加 echo 语句时if,我可以看到该java_exe变量未设置或为空。我已经在 Win7 机器上成功编译了我的 Android 应用程序,所以我认为问题在于for上面的命令对于 WinXP 环境不正确。如何更改它以使其在 WinXP 中工作?如果问题不是特定于 WinXP,那么问题出在哪里,我该如何解决?

4

2 回答 2

1

简短的回答:

简短的回答是我认为我在 WinXP 命令行解释器中发现了一个错误。至少,Win7 中的行为与 WinXP 不同。我首先讨论和分解问题的原因。find_java.bat最后,我将对Android SDK 附带的脚本提出修复建议。

长答案:

有问题的行实际上是find_java.bat脚本中的 for 循环:

for /f %%a in ('%~dps0\find_java.exe -s') do set java_exe=%%a

根据MS docs,此处适用的语法是用于迭代文件名的 for 循环:

for /F ["ParsingKeywords"] {%% | %}variable in (filenameset) do command [CommandLineOptions]

让我们分解一下:

  • 我们没有使用"ParsingKeywords"
  • 如果这个命令是在批处理脚本中使用的,那么我们需要%%在变量名前面。如果我们从命令行运行它,那么只%使用一个。
  • 在我们的情况下,'%~dps0\find_java.exe -s'描述了“文件名集”。这应该评估 running 的输出find_java.exe -s

    • find_java.exe在我的 WinXP 机器上从 MinGW 命令行手动运行会得到正确的输出。
    • 接下来我修改了find_java.bat文件如下:

      • rem一开始就发出@echo off命令。(这在 OP 中没有显示。)这会在执行时打印出批处理文件中的每个命令。
      • 添加了一个 echo 命令来查看java_exe

      为了find_java.bat直接运行修改后的文件,我使用了原生的 WinXPcmd命令行。(我也应该使用 MinGW 中的 ant 脚本尝试此操作。)相关输出是

      C:\Program Files\Android\android-sdk\tools\lib>for /F %a in ('C:\PROGRA~1\ANDROID\ANDROI~1\tools\lib\FIND_J~1\find_java.exe -s') do set java_exe=%a
      The system cannot find the path specified.
      
      C:\Program Files\Android\android-sdk\tools\lib>echo ************ java_exe=
      ************ java_exe=
      

      如您所见,java_exe为空。我也发现路径C:\PROGRA~1\ANDROID\ANDROI~1\tools\lib\FIND_J~1\find_java.exe有点奇怪;相反,它应该是C:\PROGRA~1\ANDROID\ANDROI~1\tools\lib\find_java.exe。进一步的调查揭示了正在发生的事情:

      • %0、%1、%2 等是指命令行参数
      • 语法 %~[modifiers][#] 提供了一些关于如何处理命令行参数的附加参数。特别是,modifiers这里的值包括

        • d = 展开驱动器号
        • p = 展开路径名
        • s = 使用 8.3 DOS 短名称展开

        这个想法是我们要运行与该代码所在find_java.exe的脚本位于同一目录中的可执行文件。指批处理脚本的名称。现在由于某种原因,WinXP 命令行解释器在此扩展中包含批处理脚本的文件名,而不仅仅是扩展它所在的路径。由于路径不正确,因此永远不会执行并且变量永远不会设置为有效值。另一方面,Win7只扩展了批处理脚本的路径,一切运行良好。find_java.bat%0find_java.exejava_exe

    • command设置java_exe稍后在另一个脚本中使用的变量的值。

解决方案: 当我删除s修饰符时,'%~dps0\find_java.exe -s'给出不带文件名的执行批处理文件的路径。但是,现在路径中可能存在空格和其他特殊字符。为了解决这个问题,我只需在适当的地方添加双引号。最后的 for 命令如下所示:

for /f %%a in ('"%~dp0\find_java.exe" -s') do set java_exe=%%a

由于删除s修饰符时行为会发生变化,因此我认为 WinXP 命令行解释器中存在错误。

于 2012-10-05T19:20:14.257 回答
0

将 c:/PROGRA~1/Java/JDK16~1.0_3\bin\ 添加到 Path 环境变量

于 2012-10-04T21:38:20.830 回答