簡體   English   中英

如何在NetBeans中的Android項目中使用外部jar?

[英]How can I use an external jar in an Android project in NetBeans?

我需要創建一個Android庫,我可以將其作為jar包含在任何Android應用程序中。 我使用NetBeans 6.8,nbandroid插件和Android SDK。

我到目前為止采取的步驟是:

1)創建庫項目,包含android.jar以訪問Android類(該庫使用android.util.Log和其他Android類)。

2)將庫編譯為jar。

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

4)將<uses-library>添加到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)

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

看來我解決了這個問題。

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

這是螞蟻腳本的罪名:

<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命令行工具生成的build.xml(使用nbandroid插件在NetBeans中創建Android項目時生成的腳本非常不同)。


附錄:由於我在談論NetBeans,另一種方法是通過覆蓋項目的build.xml中的-pre-jar目標,而不是上面對build-impl.xml的更改。 這是通過在build.xml中添加以下內容來完成的:

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

這樣,庫的jar與構建的類一起出現,並自動包含在內。

在你的庫中包含android.jar似乎是錯誤的 - 你可以編譯它,但不應該將它捆綁到你的JAR中。
當人們在他們的Android應用程序中使用您的庫時,它將根據他們選擇的所需框架版本進行編譯。

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

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

不得包含在您的清單中,其用途是包括應用程序鏈接的本機共享庫(即:maps),而不是您在項目中使用的jar。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM