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

时间:2010-01-13 15:28:00

标签: android netbeans jar

我需要创建一个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)

我是否必须将库添加到其他位置的构建路径中?我错过了什么吗?

3 个答案:

答案 0 :(得分:6)

看来我解决了这个问题。

我不知道在阅读有关如何使用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与构建的类一起出现,并自动包含在内。

答案 1 :(得分:0)

在您的库中包含android.jar似乎是错误的 - 您可以针对它进行编译,但不应将其捆绑到您的JAR中。
当人们在他们的Android应用程序中使用您的库时,它将根据他们选择的所需框架版本进行编译。

无论如何,在Eclipse中,您需要做的就是使用库JAR将其添加到构建路径中。我不明白为什么NetBeans会有所不同。当你构建它时,它在构建路径中似乎是合乎逻辑的! :)

答案 2 :(得分:0)

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

不得包含在您的清单中,其用法是包含应用程序链接的本机共享库(即:地图),而不是您在项目中使用的jar。

您提到的其他步骤是正确的,并且在Eclipse中工作,除非插件出现问题,否则应该在Netbeans中工作。