Как я могу использовать внешнюю банку в проекте Android в NetBeans?

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

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

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

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

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

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
задан Alpha Hydrae 14 January 2010 в 08:49
поделиться

3 ответа

Похоже, я решил проблему.

Не знаю, пропустил ли я шаг при чтении о том, как использовать плагин для 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}"/>

С внешним.libs.dir, указывающим на директорию, содержащую банку с библиотекой.

Спасибо Кристоферу за то, что заставил меня взглянуть на 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>

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

6
ответ дан 17 December 2019 в 02:29
поделиться

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

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

0
ответ дан 17 December 2019 в 02:29
поделиться
<uses-library android:name="com.mylibrarypackage" />

не должен быть включен в вашу декларацию, ее использование должно включать совместно использованные библиотеки собственного компонента, против которых соединено приложение (т.е.: карты), не банки вы используете в своем проекте.

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

0
ответ дан 17 December 2019 в 02:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: