2010-01-13 101 views
6

我需要創建一個Android庫,我可以將它作爲jar包含在任何Android應用程序中。我使用NetBeans 6.8,nbandroid插件和Android SDK。如何在NetBeans的Android項目中使用外部jar?

我把到目前爲止的步驟是:

1)創建庫項目,包括的android.jar能夠訪問到Android類(庫使用android.util.Log和其他Android類)。

2)將庫編譯爲jar。

3)將庫的jar添加到Android應用程序(右鍵單擊項目節點下的Libraries並添加jar)。

4)將<使用庫>添加到Android清單。(錯誤的和不必要的)

第3步至少允許我在應用程序的源代碼中引用庫的類,但這些類實際上並沒有在編譯時被包含。當我運行該應用程序時,在日誌中出現以下錯誤。

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) 

是否必須將庫添加到構建路徑的其他位置?我錯過了什麼嗎?

回答

6

看來我解決了這個問題。

我不知道如果我在閱讀關於如何使用nbandroid插件時錯過了一個步驟,但生成的build-impl.xml似乎沒有包括我在創建APK時使用NetBeans添加的任何庫。

這是罪證一塊Ant腳本:

<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> 

該庫包含在我的問題提到的錯誤消失了,如果我加入這最後一個參數:

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

隨着external.libs.dir指向包含庫的jar的目錄。

感謝Christopher讓我看看構建。由Android命令行工具生成的xml(使用nbandroid插件在NetBeans中創建Android項目時生成的腳本完全不同)。


附錄:自從我說的是NetBeans中,這樣做的另一種方式是,取代上述變化build-impl.xml中通過在項目的build.xml重寫-pre-jar目標。這是通過添加以下到build.xml文件完成:

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

這樣,圖書館的罐子是內置類一起存在,並自動列入。

0

在您的庫中包含android.jar似乎不對—您可以對其進行編譯,但不應將其捆綁到您的JAR中。
當人們在他們的Android應用中使用你的庫時,它會根據他們選擇的期望的框架版本進行編譯。

無論如何,在Eclipse中,您只需要使用庫JAR將其添加到構建路徑。我不明白爲什麼NetBeans會有所不同。正如你在構建它時那樣,它在構建路徑中似乎是合乎邏輯的! :)

+0

我不明白爲什麼它會有所不同,但在日誌中的錯誤似乎表明,否則,除非有其他東西我失蹤。 – 2010-01-13 21:47:12

+0

然後我責備NetBeans插件! ;)如果你使用ant從命令行編譯它,它會工作嗎?我想默認情況下,Android Ant腳本爲包含的JAR引用一個'libs'目錄。 – 2010-01-13 22:47:05

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

不得列入您的清單,其用途是包括本地共享庫的應用程序對(即:地圖)鏈接不使用的是在您的項目罐子。

你提到的其他步驟是正確的,並在Eclipse中工作,並應在Netbeans中工作,除非插件有問題。

+0

如果我們在清單中使用「uses-library」標記,那麼放置外部庫的位置。 「android:name」應該是文件名或包名? – Fakebear 2014-05-14 03:02:32

相關問題