2010-01-13 32 views
6

Tôi cần tạo thư viện Android mà tôi có thể đưa vào làm một cái bình trong bất kỳ ứng dụng Android nào. Tôi sử dụng NetBeans 6.8, plugin nbandroid và SDK Android.Làm thế nào tôi có thể sử dụng một bình bên ngoài trong một dự án Android trong NetBeans?

Các bước tôi mất cho đến nay là:

1) Tạo dự án thư viện, với android.jar bao gồm để có quyền truy cập đến các lớp học Android (thư viện sử dụng android.util.Log và các lớp học Android khác).

2) Biên dịch thư viện làm bình.

3) Thêm jar của thư viện vào ứng dụng Android (nhấp chuột phải vào Thư viện bên dưới nút dự án và thêm bình).

4) Thêm < sử dụng-thư viện > vào tệp kê khai Android. (sai và không cần thiết)

Bước 3 ít nhất cho phép tôi tham khảo các lớp của thư viện trong mã nguồn của ứng dụng, nhưng các lớp dường như không thực sự được đưa vào thời gian biên dịch. Khi tôi chạy ứng dụng, tôi nhận được lỗi sau trong nhật ký.

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) 

Tôi có phải thêm thư viện vào đường dẫn xây dựng ở nơi khác không? Tui bỏ lỡ điều gì vậy?

Trả lời

6

Dường như tôi đã giải quyết được sự cố.

Tôi không biết nếu tôi bỏ lỡ một bước khi đọc về cách sử dụng plugin nbandroid, nhưng tệp build-impl.xml được tạo dường như không bao gồm bất kỳ thư viện nào tôi thêm với NetBeans khi tạo APK.

Đây là mảnh buộc tội của kịch bản kiến:

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

Thư viện được bao gồm và lỗi được đề cập trong câu hỏi của tôi biến mất nếu tôi thêm đối số cuối cùng này:

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

Với external.libs.dir trỏ đến thư mục chứa jar của thư viện.

Nhờ Christopher đã khiến tôi nhìn vào bản dựng.xml được tạo bởi các công cụ dòng lệnh của Android (kịch bản được tạo khi tạo dự án Android trong NetBeans với plugin nbandroid hoàn toàn khác).


Phụ Lục: Kể từ khi tôi đang nói về NetBeans, một cách khác để làm điều này là bằng cách ghi đè các mục tiêu -pre-jar trong build.xml của dự án, thay vì sự thay đổi trên để xây dựng-impl.xml. Việc này được thực hiện bằng cách thêm nội dung sau vào build.xml:

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

Bằng cách này, bình của thư viện có sẵn cùng với các lớp được tạo và tự động bao gồm.

0

Bao gồm android.jar trong thư viện của bạn có vẻ sai — bạn có thể biên dịch chống lại nó nhưng không nên gộp nó vào JAR của bạn.
Khi mọi người sử dụng thư viện của bạn trong các ứng dụng Android của họ, nó sẽ được biên dịch dựa trên phiên bản khung mong muốn mà họ đã chọn.

Dù sao, trong Eclipse tất cả những gì bạn cần làm là với một thư viện JAR là thêm nó vào đường dẫn xây dựng. Tôi không hiểu tại sao NetBeans lại khác. Khi bạn đang xây dựng chống lại nó, có vẻ hợp lý cho nó để được trong con đường xây dựng! :)

+0

Tôi không thấy lý do tại sao nó sẽ khác nhau, nhưng lỗi trong nhật ký dường như chỉ ra khác, trừ khi có điều gì đó khác tôi bị thiếu. –

+0

Sau đó, tôi đổ lỗi cho plugin NetBeans! ;) Nó hoạt động nếu bạn biên dịch nó từ dòng lệnh bằng cách sử dụng ant? Tôi nghĩ theo mặc định, tập lệnh ant Android tham chiếu thư mục 'libs' cho các JAR được bao gồm. –

0

không được bao gồm trong tệp kê khai của bạn, cách sử dụng của nó là bao gồm thư viện gốc mà ứng dụng được liên kết với (ví dụ: maps) không phải lọ bạn đang sử dụng trong dự án của bạn.

Các bước khác mà bạn đề cập là chính xác và hoạt động trong Eclipse và sẽ hoạt động trong Netbeans trừ khi có sự cố với plugin.

+0

Nơi đặt thư viện bên ngoài, nếu chúng tôi sử dụng thẻ "sử dụng thư viện" trong tệp kê khai. Tên "android: name" phải là tên tệp hoặc tên gói? – Fakebear

Các vấn đề liên quan