我試圖構建一個具有一些依賴關係的Android項目。 jar文件位於lib /目錄中。我可以通過將這些jar文件添加到我的類路徑來構建項目,但當然它強制關閉模擬器,因爲這些庫不存在。如何從命令行將外部jar庫添加到Android項目中
我正在從螞蟻的命令行執行此操作(日食中的而不是)。我怎樣才能使它包含apk中的命令行中的庫?
我試圖構建一個具有一些依賴關係的Android項目。 jar文件位於lib /目錄中。我可以通過將這些jar文件添加到我的類路徑來構建項目,但當然它強制關閉模擬器,因爲這些庫不存在。如何從命令行將外部jar庫添加到Android項目中
我正在從螞蟻的命令行執行此操作(日食中的而不是)。我怎樣才能使它包含apk中的命令行中的庫?
周杰倫K公司的答案是正確的,在寫作的時候,但現在的SDK已經改變了,這裏是做它的新方式:
以下行添加到ant.properties
:
jar.libs.dir=lib
經測試, external.libs.dir無效。
有2小時來尋找這一答案後,在2011年10月改爲in December 2010,然後再
在編譯做到這一點:
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上將幾乎相同。
回答我的問題:
我創建了一個文件 「build.properties」,並補充線
external.libs.dir=lib
這是一個幸運的猜測,真的。
當我這樣做時,ant會創建一個「libs」目錄。如果我把罐子放進去,它就會起作用。不幸的是我需要使用「lib」,因爲每個人都在Eclipse中配置了「lib」。而這個解決方案對我不起作用: -/ – 2011-02-15 08:08:23
但是,如果我需要從分開的文件夾中添加兩個庫?我需要做什麼? – RagnarR 2012-02-03 10:04:12
external.libs.dir=lib
,這爲我工作。我的libs目錄下的jar文件最終編譯AND與APK捆綁在一起。
如果將庫存儲在$ {basedir}/libs中,ant腳本將能夠找到它們。
我查看了當前的ant腳本($ {sdk.dir} /tools/ant/build.xml),並將jar.libs.dir定義爲「libs」。
僅供參考,螞蟻腳本是很好的文檔,因此很容易追蹤。
如果你移動libs,一定要編輯你的.classpath文件,以防止eclipse用戶不必要地遭受損失。在${YOUR_PROJECT}/libs
目錄
放瓶子的jar.libs.dir
屬性是單目錄。它不像一個CLASSPATH,它是一個冒號/分號分隔的列表。在jar.libs中有多個目錄的方法。dir不是直接設置;讓它默認爲libs
並轉到libs並創建所需的軟鏈接到您需要的.jar文件。
只是以供將來參考: 眼下沒有在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>
你不能像你在你的例子中那樣覆蓋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
上面的這個例子並不完全正確。您不能以內聯方式覆蓋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>
我該如何聲明多個目錄?什麼是分離器? – Taranfx 2011-11-02 16:55:13
沒有一個。它是「jar.libs.dir」而不是「jar.libs.dirs」。您只能指定一個目錄。但是在那個目錄中,你可以鏈接到你需要的儘可能多的罐子。 – 2012-03-30 00:46:00