2010-07-10 118 views
39

我試圖構建一個具有一些依賴關係的Android項目。 jar文件位於lib /目錄中。我可以通過將這些jar文件添加到我的類路徑來構建項目,但當然它強制關閉模擬器,因爲這些庫不存在。如何從命令行將外部jar庫添加到Android項目中

我正在從螞蟻的命令行執行此操作(日食中的而不是)。我怎樣才能使它包含apk中的命令行中的庫?

回答

29

周杰倫K公司的答案是正確的,在寫作的時候,但現在的SDK已經改變了,這裏是做它的新方式:

以下行添加到ant.properties

jar.libs.dir=lib 

經測試, external.libs.dir無效。
有2小時來尋找這一答案後,在2011年10月改爲in December 2010,然後再

+6

我該如何聲明多個目錄?什麼是分離器? – Taranfx 2011-11-02 16:55:13

+1

沒有一個。它是「jar.libs.dir」而不是「jar.libs.dirs」。您只能指定一個目錄。但是在那個目錄中,你可以鏈接到你需要的儘可能多的罐子。 – 2012-03-30 00:46:00

8

在編譯做到這一點:

javac -encoding ascii -target 1.5 -d bin/classes \ 
-bootclasspath $SDKDIR/android.jar src/some/project/* -classpath=libs/*.jar 

而且,當您正在生成的Dalvik字節碼:

dx --dex --output=bin/classes.dex bin/classes libs/*.jar 

此外,當您打包的APK文件:

apkbuilder bin/something.apk -z bin/projectname.ap_ \ 
-f bin/classes.dex -rf src -rj libs 

我假設你正在使用Linux ...在Windows上將幾乎相同。

7

回答我的問題:

我創建了一個文件 「build.properties」,並補充線

external.libs.dir=lib 

這是一個幸運的猜測,真的。

+0

當我這樣做時,ant會創建一個「libs」目錄。如果我把罐子放進去,它就會起作用。不幸的是我需要使用「lib」,因爲每個人都在Eclipse中配置了「lib」。而這個解決方案對我不起作用: -/ – 2011-02-15 08:08:23

+0

但是,如果我需要從分開的文件夾中添加兩個庫?我需要做什麼? – RagnarR 2012-02-03 10:04:12

1
external.libs.dir=lib 

,這爲我工作。我的libs目錄下的jar文件最終編譯AND與APK捆綁在一起。

3

如果將庫存儲在$ {basedir}/libs中,ant腳本將能夠找到它們。

我查看了當前的ant腳本($ {sdk.dir} /tools/ant/build.xml),並將jar.libs.dir定義爲「libs」。

僅供參考,螞蟻腳本是很好的文檔,因此很容易追蹤。

如果你移動libs,一定要編輯你的.classpath文件,以防止eclipse用戶不必要地遭受損失。在${YOUR_PROJECT}/libs目錄

1

放瓶子的jar.libs.dir屬性是目錄。它不像一個CLASSPATH,它是一個冒號/分號分隔的列表。在jar.libs中有多個目錄的方法。dir不是直接設置;讓它默認爲libs並轉到libs並創建所需的軟鏈接到您需要的.jar文件。

0

12

只是以供將來參考: 眼下沒有在SDK中的錯誤,防止使用jar.libs.dir的: http://code.google.com/p/android/issues/detail?id=33194

一個簡單的解決方案中使用jar.libs.dir再次(在等待修正bug),就是在build.xml文件中添加這個目標:

<target name="-pre-compile"> 
    <path id="project.all.jars.path"> 
     <path path="${toString:project.all.jars.path}"/> 
     <fileset dir="${jar.libs.dir}"> 
      <include name="*.jar"/> 
     </fileset> 
    </path> 
</target> 
+0

你不能像你在你的例子中那樣覆蓋project.all.jars.path。它會在ant構建過程中導致空指針異常,因爲您正在重新定義project.all.jars.path,以便$ {toString:project.all.jars.path}將計算爲null。做到這一點的正確方法是引入一個temp.jars.path,在其中包含新的jar dir,然後用temp.jars.path覆蓋project.all.jars.path – 2013-05-24 19:01:35

6

上面的這個例子並不完全正確。您不能以內聯方式覆蓋project.all.jars.path。以下是一個工作示例:

<target name="-pre-compile"> 
<!-- HACK to add the android-support-v4.jar to the classpath directly from the SDK --> 

    <echo>ORIGINAL jars.path : ${toString:project.all.jars.path}</echo> 
    <path id="project.all.jars.path.hacked"> 
      <path path="${toString:project.all.jars.path}"/> 
      <path path="${sdk.dir}/extras/android/support/v4/android-support-v4.jar"/> 
    </path> 

    <path id="project.all.jars.path"> 
      <path path="${toString:project.all.jars.path.hacked}"/> 
    </path> 
    <echo>HACKED jars.path : ${toString:project.all.jars.path}</echo> 

</target>