2010-01-13 11 views
6

Potrzebuję utworzyć bibliotekę Androida, którą mogę dołączyć jako słoik do dowolnej aplikacji na Androida. Używam NetBeans 6.8, wtyczki nbandroid i Android SDK.Jak mogę użyć zewnętrznego słoja w projekcie Android w NetBeans?

Kroki zrobiłem do tej pory to:

1) Tworzenie projektu biblioteki, z android.jar zawarte mieć dostęp do klas Android (biblioteka korzysta android.util.Log i inne zajęcia na Androida).

2) Skompiluj bibliotekę jako słoik.

3) Dodaj słoik biblioteki do aplikacji Android (kliknij prawym przyciskiem myszy Biblioteki pod węzłem projektu i dodaj słoik).

4) Dodaj < używa-biblioteki > do manifestu systemu Android. (błędne i niepotrzebne)

Krok 3 przynajmniej pozwala mi odwoływać się do klas biblioteki w kodzie źródłowym aplikacji, ale wydaje się, że klasy nie są uwzględniane podczas kompilacji. Po uruchomieniu aplikacji pojawia się następujący błąd w dzienniku.

I/dalvikvm( 349): Could not find method mylibrarypackage.MyClass.myMethod, referenced from method myapplicationpackage.HomeActivity.onCreate 
W/dalvikvm( 349): VFY: unable to resolve static method 985: Lmylibrarypackage/MyClass;.myMethod()V 
D/dalvikvm( 349): VFY: replacing opcode 0x71 at 0x000a 
D/dalvikvm( 349): Making a copy of Lmyapplicationpackage/HomeActivity;.onCreate code (160 bytes) 
D/AndroidRuntime( 349): Shutting down VM 
W/dalvikvm( 349): threadid=3: thread exiting with uncaught exception (group=0x4001b188) 
E/AndroidRuntime( 349): Uncaught handler: thread main exiting due to uncaught exception 
E/AndroidRuntime( 349): java.lang.NoClassDefFoundError: mylibrarypackage.MyClass 
E/AndroidRuntime( 349): at myapplicationpackage.HomeActivity.onCreate(HomeActivity.java:58) 
E/AndroidRuntime( 349): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
E/AndroidRuntime( 349): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2417) 
E/AndroidRuntime( 349): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2470) 
E/AndroidRuntime( 349): at android.app.ActivityThread.access$2200(ActivityThread.java:119) 
E/AndroidRuntime( 349): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1821) 
E/AndroidRuntime( 349): at android.os.Handler.dispatchMessage(Handler.java:99) 
E/AndroidRuntime( 349): at android.os.Looper.loop(Looper.java:123) 
E/AndroidRuntime( 349): at android.app.ActivityThread.main(ActivityThread.java:4310) 
E/AndroidRuntime( 349): at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime( 349): at java.lang.reflect.Method.invoke(Method.java:521) 
E/AndroidRuntime( 349): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
E/AndroidRuntime( 349): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
E/AndroidRuntime( 349): at dalvik.system.NativeStart.main(Native Method) 

Czy muszę dodać bibliotekę do ścieżki budowy gdzieś indziej? Czy czegoś brakuje?

Odpowiedz

6

Wygląda na to, że rozwiązałem problem.

Nie wiem, czy pominięto krok podczas czytania o tym, jak korzystać z wtyczki nbandroid, ale wygenerowany plik build-impl.xml nie zawiera bibliotek, które dodaję do NetBeans podczas tworzenia pliku APK.

To obciążające kawałek mrówek skryptu:

<target depends="init,compile,-pre-pre-jar,-pre-jar" name="-dex"> 
    <exec executable="${dx}" failonerror="true"> 
     <arg value="--dex"/> 
     <arg value="--output=${basedir}/${intermediate.dex}"/> 
     <arg value="--positions=lines"/> 
     <arg path="${build.classes.dir}"/> 
    </exec> 
</target> 

Biblioteka jest włączone, a błąd wymieniony w moim pytaniem zniknie, jeśli dodam ten ostatni argument:

<arg path="${external.libs.dir}"/> 

Z external.libs.dir wskazując katalog zawierający słoik biblioteki.

Dziękuję Christopherem za sprawienie, żebym spojrzał na kompozycję.xml generowane przez narzędzia wiersza poleceń systemu Android (skrypt generowany podczas tworzenia projektu Android w NetBeans z wtyczką nbandroid jest zupełnie inny).


Uzupełnienie: Od mówię NetBeans, innym sposobem osiągnięcia tego celu jest nadrzędnymi cel -pre-jar w build.xml projektu, zamiast powyższej zmiany na budowę-impl.xml. Odbywa się to poprzez dodanie następujących do build.xml:

<target name="-pre-jar"> 
    <copy todir="${build.classes.dir}"> 
    <fileset dir="${external.libs.dir}" /> 
    </copy> 
</target> 

ten sposób słoik biblioteki jest obecny wraz z wbudowanych klas, a automatycznie włączone.

0

W tym android.jar w Twojej bibliotece wydaje się być nieprawidłowy — można skompilować przeciwko nie, ale nie należy pakować go do JAR.
Gdy użytkownicy korzystają z biblioteki w swoich aplikacjach na system Android, zostaną skompilowani z wybraną przez siebie wersją frameworka.

W Eclipse wszystko, co musisz zrobić, to plik JAR biblioteki, który dodaje go do ścieżki budowania. Nie rozumiem, dlaczego NetBeans byłby inny. Kiedy budujesz przeciw niemu, wydaje się logiczne, że znajduje się on na ścieżce budowania! :)

+0

Nie rozumiem, dlaczego byłaby inna, ale błąd w dzienniku wydaje się wskazywać inaczej, chyba że jest coś, czego mi brakuje. –

+0

Następnie winię wtyczkę NetBeans! ;) Czy to działa, jeśli skompilujesz go z wiersza poleceń za pomocą mrówki? Domyślnie skrypt mrówki dla systemu Android odwołuje się do katalogu 'libs' zawierającego dołączone pliki JAR. –

0
<uses-library android:name="com.mylibrarypackage" /> 

nie muszą być zawarte w manifeście, jego użycie jest to natywne biblioteki współdzielone aplikacja jest umieszczony przed (tj .: mapy), nie słoiki używasz w swoim projekcie.

Inne wspomniane kroki są prawidłowe i działają w środowisku Eclipse i powinny działać w Netbeans, chyba że wystąpił problem z wtyczką.

+0

Gdzie umieścić bibliotekę zewnętrzną, jeśli w manifeście używamy tagu "uses-library". "Android: nazwa" powinna być nazwą pliku lub nazwą pakietu? – Fakebear