2012-10-04 96 views
0

澄清: 我以前的Android開發環境是使用命令行構建工具與安裝有Git的MinGW bash shell的Win7機器。我試圖在古老的WinXP機器上創建一個類似的環境。適用於Android develepmont環境的Windows XP

原題:

我設立一個老的Windows XP機器爲我的Android開發環境。 (是啊,我知道我希望我有辦法購買一臺新的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安裝的正確位置。但是,當我在上述批處理腳本代碼片段中的forif命令之間添加回顯語句時,我可以看到java_exe變量未設置或爲空。我已經在Win7機器上成功編譯了我的Android應用程序,所以我認爲問題在於上面的for命令對於WinXP環境不正確。如何更改它以使其在WinXP中正常運行?如果問題不是特定於WinXP,那麼有什麼問題,我該如何解決它?

+0

我知道這不是一個直接的解決方案,但是如果您因爲缺少Win7或8許可證而運行XP,爲什麼不運行Ubuntu?我認爲Android開發更友好。 – dennisdrew

+0

@dennisdrew我正在考慮運行一些Linux的味道。最大的問題是這臺機器沒有互聯網連接,所以我正在從我的USB atm上安裝東西。我不確定這對Linux有多好... –

+0

@ Code-Guru:我運行XP,但是我使用Eclipse進行Android開發。我知道這並不能回答你的問題,但經過相當簡單的設置後,就不需要運行命令行工具或批處理文件。 – Squonk

回答

1

答案很簡單:

簡短的回答是,我想我發現了一個錯誤的WinXP命令行解釋器。至少,Win7中的行爲與WinXP的行爲不同。我首先討論並打破問題的原因。我將完成對Android SDK附帶的find_java.bat腳本的建議修復。

龍答:

出錯行實際上是在從find_java.bat腳本循環:

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'描述了「filenameset」。這應該評估到運行find_java.exe -s的輸出。

    • 運行find_java.exe手動從我的WinXP機器上的MinGW命令行提供正確的輸出。
    • 接着我修改find_java.bat文件如下:

      • rem「開頭D OUT的@echo off命令。 (這在OP中未顯示。)這將在批處理文件執行時打印出每個命令。
      • 添加echo命令看到java_exe

      值要直接運行修改find_java.bat文件,我使用的本機的WinXP cmd命令行。 (我也應該試試這個使用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的值包括

        • d =展開盤符
        • P =展開的路徑名
        • S =展開使用短8.3 DOS名稱

        的想法我們希望運行find_java.exe可執行文件,該文件位於與代碼所在的find_java.bat腳本相同的目錄中。 %0引用批處理腳本的名稱。現在由於某種原因,WinXP命令行解釋程序在此擴展中包含批處理腳本的文件名,而不僅僅是擴展它所在的路徑。由於路徑不正確,因此find_java.exe從不執行,並且java_exe變量永遠不會設置爲有效值。另一方面,Win7擴展了批處理腳本的路徑,一切都運行良好。

    • command套,其在另一個腳本以後使用的java_exe變量的值。

解決方案: 當我刪除從'%~dps0\find_java.exe -s's修改給出了執行批處理文件的路徑沒有文件名。但是,現在路徑中可能會有空格和其他特殊字符。爲了解決這個問題,我只需在適當的地方添加雙引號。對於命令的最後是這樣的:

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

由於行爲取出s修改的時候改變,我相信這是在WinXP的命令行解釋器中的錯誤。

0

添加C:/PROGRA~1/Java/JDK16~1.0_3 \ BIN \到Path環境變量

+0

感謝您的建議。這個目錄已經在PATH變量中,因爲手工運行'find_java.exe -s'會提供預期的輸出。但是,運行這個相同的命令(嵌入在for循環中給出的OP中所示的bash腳本)不會給出相同的輸出。 –