2010-07-10 21 views
39

Próbuję zbudować projekt Androida, który ma pewne zależności. Pliki jar znajdują się w katalogu lib /. Mogę zbudować projekt, dodając plik jar do mojej ścieżki klasy, ale oczywiście Force Closes w emulatorze, ponieważ te biblioteki nie są obecne.Jak dodać zewnętrzne biblioteki słoików do projektu Android z wiersza polecenia

Robię to z linii poleceń z ant (nie w zaćmienie). Jak mogę włączyć te biblioteki w pliku APK z wiersza poleceń?

Odpowiedz

29

Jay K miała rację w momencie pisania, ale teraz SDK nie zmieniło, a tu jest nowy sposób, aby to zrobić:

Dodaj następujący wiersz do ant.properties:

jar.libs.dir=lib 

Testowane, działa tam, gdzie external.libs.dir nie działa.
Zmieniło in December 2010 a następnie ponownie w październiku 2011 roku

+6

Jak zadeklarować wiele katalogów? Czym jest separator? – Taranfx

+1

Nie ma ani jednego. To "jar.libs.dir", a nie "jar.libs.dirs". Możesz podać tylko jeden katalog. Ale w tym katalogu możesz linkować do tak wielu słoików, ile potrzebujesz. –

8

Na kompilacji to zrobić:

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

A kiedy jesteś generowania kodu bajtowego dla Dalvik:

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

Również podczas pakowania pliku APK:

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

Zakładam, że korzystasz z Linuksa ... w systemie Windows będzie prawie taki sam.

7

Odpowiadając na moje własne pytanie:

stworzyłem plik "build.properties" i dodaje linię

external.libs.dir=lib 

To był szczęśliwy przypuszczenie, naprawdę. Odpowiedź

+0

Kiedy to zrobię, ant utworzy katalog "libs". Jeśli włożę słoiki do środka, zadziała. Niestety muszę użyć "lib", ponieważ wszyscy skonfigurowali "lib" w Eclipse. I to rozwiązanie nie działa dla mnie: -/ –

+0

Ale jeśli potrzebuję dodać dwie biblioteki z oddzielnych folderów? Co muszę zrobić? – RagnarR

1
external.libs.dir=lib 

po 2 godzinach poszukiwania tej odpowiedzi, to pracował dla mnie. Plik jar w moim katalogu libs wreszcie kompiluje ORAZ jest dołączany do pakietu APK.

3

Jeśli przechowujesz swoje biblioteki w $ {basedir}/libs, skrypt ant będzie je mógł znaleźć.

Sprawdziłem obecny skrypt ant ($ {sdk.dir} /tools/ant/build.xml) i zdefiniowałem jar.libs.dir na "libs".

FYI, skrypt mrówki jest dobrze udokumentowany, więc można go łatwo prześledzić.

Po przeniesieniu bibliotek upewnij się, że edytujesz pliki .classpath, aby użytkownicy eclipse nie cierpieli niepotrzebnie.

0

Obiekt jar.libs.dir jest pojedynczy katalogu. To nie jest jak CLASSPATH, która jest rozdzieloną dwukropkiem/średnikiem. Sposób na posiadanie wielu katalogów w pliku jar.libs.dir nie ma ustawić go bezpośrednio; pozostaw domyślną wartość libs i przejdź do bibliotek libs i utwórz wymagane miękkie linki do plików .jar, których potrzebujesz.

12

Tylko dla przyszłości: Teraz tam jest błąd w SDK, który uniemożliwia korzystania jar.libs.dir: http://code.google.com/p/android/issues/detail?id=33194

proste rozwiązanie do korzystania jar.libs.dir ponownie (w oczekiwaniu na błąd do naprawienia), należy dodać ten cel do pliku 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

nie można zastąpić elementu project.all.jars.path, tak jak w przykładzie. Spowoduje to wyjątek wskaźnika pustego podczas procesu budowania mrówek, ponieważ zmieniasz ponownie wartość project.all.jars.path, aby $ {toString: project.all.jars.path} miało wartość null. Prawidłowym sposobem wykonania tej czynności jest wprowadzenie temp.jars.path, do której dodajesz nowy katalog plików jar, a następnie nadpisanie parametru project.all.jars.path za pomocą temp.jars.path –

6

Powyższy przykład nie działa poprawnie. Nie można zastąpić in.instrukcji project.all.jars. Poniżej znajduje się działający przykład:

<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> 
Powiązane problemy