2011-12-20 31 views
11

Tôi đã cố gắng giữ cho một dự án trò chơi hoàn toàn độc lập, vì vậy tôi chia nó thành ba dự án từ cấp độ thấp đến cấp cao nhất cụ thể như sau: , trò chơi, trò chơi android.Hoạt động Android dưới Eclipse/ADT với phụ thuộc dự án (Không giải quyết XY)

Các lớp tham gia/interfaces trong lỗi là những:

  1. (mức thấp) dự án động cơ định nghĩa giao diện này:

    com.myteam.engine.IGame 
    
  2. (mức trung bình) dự án nền tảng trò chơi độc lập xác định những lớp học:

    com.myteam.myproject.Game 
    com.myteam.myproject.MyProject (derived from com.myteam.myproject.Game) 
    
  3. (cấp cao nhất) android projec t triển khai hoạt động, v.v .:

    com.myteam.myproject.android.MyAndroidActivity (using com.myteam.myproject.MyProject) 
    

Tất cả các biên dịch tốt và chạy một cách hoàn hảo trong môi trường Windows (với một dự án Windows trên mức 3 sử dụng hai đầu tiên).

Nhưng khi chạy với ADT, nó không thành công khi chạy khi Hoạt động bắt đầu. Ứng dụng Android về cơ bản chỉ hiển thị ngăn xếp cuộc gọi với ngoại lệ "NoClassDefFoundError com.myteam.myproject.MyProject".

Ngoại lệ dường như được gây ra bởi siêu lớp của nó (hoặc siêu đẳng giao diện) trong khi tải/giải quyết chế độ xuất ra LogCat tiết lộ:

12-20 19:51:51.897: D/ddm-heap(218): Got feature list request 
12-20 19:51:52.207: I/dalvikvm(218): Failed resolving Lcom/myteam/myproject/Game; interface 18 'Lcom/myteam/engine/IGame;' 
12-20 19:51:52.217: W/dalvikvm(218): Link of class 'Lcom/myteam/myproject/Game;' failed 
12-20 19:51:52.227: W/dalvikvm(218): Unable to resolve superclass of Lcom/myteam/myproject/MyProject; (52) 
12-20 19:51:52.227: W/dalvikvm(218): Link of class 'Lcom/myteam/myproject/MyProject;' failed 
12-20 19:51:52.227: E/dalvikvm(218): Could not find class 'com.myteam.myproject.MyProject', referenced from method com.myteam.myproject.android.MyAndroidActivity.onCreate 
12-20 19:51:52.227: W/dalvikvm(218): VFY: unable to resolve new-instance 54 (Lcom/myteam/myproject/MyProject;) in Lcom/myteam/myproject/android/Youcode_AndroidActivity; 
12-20 19:51:52.227: D/dalvikvm(218): VFY: replacing opcode 0x22 at 0x0008 
12-20 19:51:52.227: D/dalvikvm(218): Making a copy of Lcom/myteam/myproject/android/Youcode_AndroidActivity;.onCreate code (88 bytes) 

Tôi đã cố gắng thêm hai dự án đầu tiên dưới "Xây dựng Path/Order and Export "Cài đặt dự án Eclipse của dự án trò chơi android như được mô tả trong các bài đăng và diễn đàn khác nhưng nó không thay đổi gì cả.

Linh cảm của tôi là cài đặt Tệp kê khai hoặc Dự án cần đề cập đến phụ thuộc gói/gói khác cho gói hàng hoặc gói chạy trong thời gian chạy. Bất kỳ ý tưởng?

+0

Bạn đã kiểm tra xem .apk có chứa các lớp không được tìm thấy không? – bart

+1

Tôi có cùng một vấn đề chính xác như bạn: Một dự án Android phụ thuộc vào các dự án chỉ có Java. Cho đến ngày hôm nay (khi tôi cập nhật lên Công cụ SDK Android r17 từ r16), tôi đã có thể thực hiện công việc này với Project Properties-> Java Build Path-> Projects. Nhưng bây giờ tôi nhận được cùng một ngoại lệ mà bạn báo cáo. Tôi đã gửi một báo cáo lỗi: http://code.google.com/p/android/issues/detail?id=27882 – jfritz42

+0

Wow tôi đã đi hạt với vấn đề này. Liên kết may mắn của jfritz42 có câu trả lời tôi cần. Thx người đàn ông. – tulio84z

Trả lời

2

Thêm tên dự án phụ thuộc của bạn vào tệp .claspath của dự án Android của bạn. như thế:

<?xml version="1.0" encoding="UTF-8"?> 
<classpath> 
    <classpathentry kind="src" path="src"/> 
    <classpathentry kind="src" path="gen"/> 
    <classpathentry combineaccessrules="false" kind="src" path="/DependentProject1"/> 
    <classpathentry combineaccessrules="false" kind="src" path="/DependentProject2"/> 
    <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/> 
    <classpathentry kind="output" path="bin"/> 
</classpath> 
2

Tôi đã cố gắng để tìm một giải pháp đơn giản cho thời gian dài này trước, như xa như tôi có thể nói, cách duy nhất để làm cho ADT xuất apk cuối cùng với các lớp thư viện phụ thuộc là rõ ràng thêm tất cả lib.jar bên ngoài của bạn (được tạo từ các dự án khác của bạn) vào đường dẫn xây dựng của dự án Android của bạn.

Phiên bản hiện tại của trình cắm thêm ADT của Eclipse có vòng đời xây dựng không xác định trước (cụ thể trong bước dexing), rõ ràng nó không hỗ trợ nhóm dự án ngoài ba loại dự án Android cùng nhau (cổ điển, thư viện và thử nghiệm). Nói cách khác, ADT không biết cách xây dựng dự án Android của bạn với dự án phụ thuộc java thông thường theo đường dẫn xây dựng và tự động thêm lib.jar được tạo bởi dự án phụ thuộc vào đường dẫn xây dựng dự án chính của bạn (mặc dù bạn thêm chúng vào thứ tự và Xuất danh sách), trừ khi bạn thêm lib.jar bên ngoài vào đó một cách rõ ràng. Giả sử bạn thêm C: \ workspace \ game \ target \ game.jar và C: \ workspace \ engine \ target \ engine.jar vào android-game của bạn build path của dự án, lệnh để tạo ra tập tin dex của bạn nên được một cái gì đó như thế này:

java [-Xmx1024M, -jar, C:\android-sdk-r16\platform-tools\lib\dx.jar, --dex, --output=C:\workspace\android-game\target\classes.dex, C:\workspace\android-game\target\classes, C:\workspace\game\target\game.jar, C:\workspace\engine\target\engine.jar] 

Nếu bạn có kế hoạch áp dụng một số công cụ xây dựng bên ngoài để quản lý chu trình xây dựng đời sống dự án của bạn, tôi biết Maven cung cấp cấu hình linh hoạt hơn trên vòng đời xây dựng Android. Nó hỗ trợ dự án đa mô-đun (nhóm dự án) và có thể xử lý phụ thuộc dự án java thông thường một cách chính xác.

Kiến thức của tôi dựa trên Eclipse, Mong được nghe một số tiếng ồn từ nguồn Android hoặc người dùng IDE phức tạp khác.

Update từ ADT 17.0.0:

mới nhất r17 phát hành SDK với ADT 17.0.0 tuyên bố để xử lý này trường hợp sử dụng đúng cách bây giờ: thay đổi

Eclipse cụ

Các động classpath container được gọi là "Dự án thư viện" đã được đổi tên thành "Android phụ thuộc" vì nó bây giờ có chứa nhiều hơn chỉ là dự án thư viện.

Vùng chứa giờ đây cũng sẽ được điền bằng các dự án chỉ có Java được tham chiếu bởi Dự án thư viện. Nếu các dự án Java đó cũng tham khảo các dự án Java khác và/hoặc các tệp jar, chúng sẽ được thêm tự động (các tệp jar được tham chiếu thông qua các thư viện người dùng cũng được hỗ trợ).

Quan trọng: điều này chỉ xảy ra nếu tham chiếu được đặt để được xuất trong dự án tham chiếu. Lưu ý rằng đây không phải là mặc định khi thêm dự án hoặc tệp jar vào đường dẫn xây dựng dự án. Dự án thư viện (và nội dung của các tệp jar/* jar của chúng) luôn được xuất. Thay đổi này chỉ ảnh hưởng đến các dự án chỉ có Java và các tệp jar của riêng chúng.

Một lần nữa, các bản sao (cả dự án và tệp jar) được phát hiện và xóa.

Kiểm tra changelog.

1

Đường dẫn Xây dựng Java của dự án cấp trung bao gồm dự án cấp thấp, tôi đoán vậy. Bạn đã kiểm tra dự án cấp thấp ở đó chưa (tab "Đặt hàng và xuất khẩu")? Nếu không, phụ thuộc dự án cấp thấp sẽ không được chuyển tiếp đến dự án cấp cao, không bao gồm IGame từ APK, điều này thực sự gây ra lỗi.

Tuy nhiên, giải pháp này AFAIK sẽ không hoạt động nếu dự án của bạn chứa những thứ cụ thể cho Android như tài nguyên và nội dung tương tự.

0

Tôi nghi ngờ về bạn và dự án của bạn. Từ quan điểm của tôi, tôi thấy bạn có một thiết kế tốt. Nhưng tại sao bạn làm việc với Build Path/Order and Export? Thành thật mà nói tôi chưa bao giờ đi đến tab đó từ ngày đầu tiên tôi làm việc với Eclipse.

Để nhập tệp jar làm thư viện, hãy sử dụng tab Libraries -> thêm các lọ bên ngoài.

Và tôi xin lỗi tôi không biết về lập trình trò chơi, đây chỉ là gợi ý: đảm bảo công cụ của bạn phù hợp với những gì Android hỗ trợ. Ví dụ: Android không hỗ trợ javax.imageio. Nếu không, ứng dụng có thể được biên dịch với các jars bên ngoài, nhưng có thể bị lỗi trong thời gian chạy.

12

Tôi có một ứng dụng Android/Java ba tầng, gần giống như bạn:

  1. Java chỉ dự án để giao tiếp mạng ở mức độ thấp
  2. Java chỉ dự án đến các tính năng cấp độ dự án thấp của trừu tượng
  3. ứng dụng Android

Mỗi điều trên là một dự án Eclipse riêng biệt chứa trong một không gian làm việc duy nhất.

Đây là những gì bạn cần làm:

  1. Theo dự án của App Properties-> Java Build Path-> Các dự án, thêm Java chỉ dự án
  2. Theo dự án của App Properties-> Java Build Path -> trình tự, xuất khẩu, kiểm tra các chỉ Java dự án (đánh dấu chúng để xuất khẩu)

Bây giờ ứng dụng của bạn nên xây dựng và chạy mà không có ngoại lệ NoClassDefFoundError hoặc VFY lỗi như sau:

03-27 21:10:17.120: W/dalvikvm(420): VFY: unable to find class referenced in signature (Labstractionlayer/BaseStationManager;) 
03-27 21:10:17.120: W/dalvikvm(420): VFY: unable to find class referenced in signature (Labstractionlayer/BaseStationManager;) 
03-27 21:10:17.160: I/dalvikvm(420): Failed resolving Lcom/demo/log/AndroidLogWrapper; interface 253 'Lcommon/Logger/LogWrapper;' 
03-27 21:10:17.160: W/dalvikvm(420): Link of class 'Lcom/demo/log/AndroidLogWrapper;' failed 
03-27 21:10:17.160: E/dalvikvm(420): Could not find class 'com.demo.log.AndroidLogWrapper', referenced from method com.demo.Application.onCreate 
03-27 21:10:17.160: W/dalvikvm(420): VFY: unable to resolve new-instance 218 (Lcom/demo/log/AndroidLogWrapper;) in Lcom/demo/Application; 
03-27 21:10:17.170: D/dalvikvm(420): VFY: replacing opcode 0x22 at 0x0003 
03-27 21:10:17.170: D/dalvikvm(420): VFY: dead code 0x0005-003c in Lcom/demo/Application;.onCreate()V 
03-27 21:10:17.170: D/AndroidRuntime(420): Shutting down VM 
03-27 21:10:17.170: W/dalvikvm(420): threadid=1: thread exiting with uncaught exception (group=0x40015560) 
03-27 21:10:17.180: E/AndroidRuntime(420): FATAL EXCEPTION: main 
03-27 21:10:17.180: E/AndroidRuntime(420): java.lang.NoClassDefFoundError: com.demo.log.AndroidLogWrapper 

BTW, trước ADT r17, bạn chỉ cần thực hiện bước 1 ở trên (thêm các dự án chỉ có Java). Nhưng bắt đầu với r17, bạn cũng cần thực hiện bước 2 (đánh dấu các dự án chỉ dành cho Java để xuất).

0

Tôi biết đây là một câu hỏi cũ, nhưng tôi tìm thấy một phương pháp mới để sắp qua lỗi này mà có thể giúp người khác với các cập nhật gần đây.

Tôi gặp lỗi này khi sử dụng câu lệnh chuyển/trường hợp trên R.id. "hằng số". Các bản cập nhật mới nhất không còn xem xét các khai báo R.java là hằng số trong mã mặc dù chúng được khai báo là cuối cùng. Điều gì xảy ra là .apk sẽ biên dịch và cài đặt nhưng mang lại những lỗi Lcom.

Để giải quyết việc này (trong Eclipse) được đưa con trỏ vào switch khai và sử dụng tổ hợp phím Ctrl + 1 để chuyển đổi switch vào một danh sách các nếu then else 's. Lưu ý nếu bạn có dấu ngắt lồng nhau trong câu hỏi trường hợp, bạn sẽ cần phải viết lại khối mã đó (có thể là thêm else 's).

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