Как я могу использовать внешний jar в проекте Android в NetBeans? - PullRequest
6 голосов
/ 13 января 2010

Мне нужно создать библиотеку Android, которую я могу включить в качестве jar в любое приложение Android. Я использую NetBeans 6.8, плагин nbandroid и Android SDK.

Шаги, которые я сделал до сих пор:

1) Создайте проект библиотеки с включенным android.jar для доступа к классам Android (библиотека использует android.util.Log и другие классы Android).

2) Скомпилируйте библиотеку как jar.

3) Добавьте банку библиотеки в приложение Android (щелкните правой кнопкой мыши на Библиотеке под узлом проекта и добавьте банку).

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)

Должен ли я добавить библиотеку в путь сборки где-нибудь еще? Я что-то упустил?

Ответы [ 3 ]

6 голосов
/ 14 января 2010

Кажется, я решил проблему.

Я не знаю, пропустил ли я шаг, читая о том, как использовать плагин nbandroid, но созданный файл build-impl.xml, похоже, не включает в себя библиотеки, которые я добавляю с NetBeans при создании APK.

Это инкриминирующая часть скрипта муравья:

<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 библиотеки.

Спасибо Кристоферу за то, что он заставил меня взглянуть на build.xml, сгенерированный инструментами командной строки Android (скрипт, сгенерированный при создании проекта Android в NetBeans с плагином nbandroid, совершенно другой).

<ч />

Добавление: поскольку я говорю о NetBeans, еще один способ сделать это - переопределить цель -pre-jar в build.xml проекта вместо вышеуказанного изменения в build-impl.xml. Это можно сделать, добавив в build.xml следующее:

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

Таким образом, jar библиотеки присутствует вместе со встроенными классами и автоматически включается.

0 голосов
/ 14 января 2010
<uses-library android:name="com.mylibrarypackage" />

не должен быть включен в ваш манифест, он используется для включения собственных общих библиотек, с которыми связано приложение (т. Е. Карты), а не с jars, которые вы используете в своем проекте.

Другие упомянутые вами шаги верны и работают в Eclipse и должны работать в Netbeans, если нет проблем с плагином.

0 голосов
/ 14 января 2010

Включение android.jar в вашей библиотеке кажется неправильным & mdash; вы можете скомпилировать его, но не должны связывать его в свой JAR.
Когда люди используют вашу библиотеку в своих приложениях для Android, она будет компилироваться с выбранной версией платформы.

В любом случае, в Eclipse все, что вам нужно сделать, - это добавить библиотеку JAR в путь сборки. Я не понимаю, почему NetBeans будет другим. Поскольку вы строите против него, кажется логичным, что он находится на пути сборки! :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...