2014-04-08 29 views
9

Có một số cách mà mã Andorid aka-native (mã Java) có thể được tích hợp vào dự án Xamarin. Các cách chính thức được liệt kê trong this article.nhập thư viện android .jar vào dự án Xamarin

Chúng tôi đang cố gắng sử dụng một phương pháp liên kết Thư viện Java được ghi lại trong bài viết. Our test andoid library is published on Github cho câu hỏi này cụ thể.

Chúng tôi đã tạo nó trong các công cụ dành cho nhà phát triển Android cài đặt nó làm Thư viện Android Java. Nó được xây dựng trong Eclipse thành một định dạng .jar mà hướng dẫn trên trang Xamarin giả định là đủ.

Nếu chúng tôi cố gắng ràng buộc .jar vào dự án của chúng tôi trong Visual Studio, Object Explorer sẽ hiển thị cho chúng tôi không gian tên của asseblie, nhưng trong mã, mặc dù hội đồng được tham chiếu, chúng tôi không thể truy cập các phương thức và lớp học trong không gian tên, bị giảm trong thử nghiệm java android lib của chúng tôi ..

Mặt khác, khi chúng tôi dùng hầu hết mọi thư .jar, thư viện android trên internet (ví dụ: this one), chúng tôi có thể liên kết và truy cập đó là phương pháp mà không có vấn đề gì.

Hãy so sánh hai .jar và nếu có thể, hãy cho tôi biết điều gì sai với thư viện android thử nghiệm của chúng tôi trên github, khiến không gian tên của chúng tôi không khả dụng từ mã.

+0

Bạn có cần "Thư viện Android" hay chỉ là thư viện thông thường? Jar ví dụ của bạn không phải là một thư viện android, nó là một thư viện java standart có chứa bó của lớp biên dịch '. Sự khác biệt ở đây là thư viện Android chứa tài nguyên để chia sẻ không chỉ mã java. Vì ví dụ của bạn Test.java không có gì về android, bạn chỉ có thể biên dịch và kết hợp nó. –

+0

Khi đổi tên * .jar thành * .zip, bạn có thể sử dụng bất kỳ công cụ lưu trữ nào để xem bên trong. Không biết về yêu cầu Android nhưng GitHub..bin/a2dp.jar của bạn chứa META-INF/MAINFEST.MF với 2 byte không có gì nên trông giống như một vấn đề trình biên dịch, vui lòng cung cấp bình thực – xmojmr

Trả lời

3

Tôi đọc bài viết cùng Binding a Java Library bạn đã làm, đã trải qua các hướng dẫn, và không có xây dựng các lỗi. Khi tôi cố gắng sử dụng các lớp từ tệp jar của tôi, intellisense không nhận ra bất cứ điều gì. Sau đó, tôi đọc bài viết tiếp theo theo số API Metadata Reference. Điều này khiến tôi nghĩ rằng có lẽ tôi nên thử chỉnh sửa tệp Transforms/Metadata.xml. Sau khi chỉnh sửa một thời gian ngắn để bao gồm một tên của gói, Visual Studio cho phép (sau khi biên dịch) một tham chiếu đến một lớp từ tệp jar. Sau đó tôi đã cố gắng gọi một phương thức từ lớp, và một lần nữa, có một lỗi trình biên dịch khác. Vì vậy, tôi đã quay lại tệp Metadata.xml và thêm một mục để đổi tên phương thức được đề cập. Tôi đã chỉnh sửa mã của mình để gọi phương thức được đổi tên và Visual Studio đã biên dịch tốt. Tôi đã tích hợp cuộc gọi này vào một trường hợp thử nghiệm đơn vị và nó đã trôi qua!

Từ đọc của tôi, có vẻ như không cần thiết để chỉnh sửa tệp Metadata.xml, nhưng ít nhất theo kinh nghiệm của tôi, có vẻ như cần thiết. Nó sử dụng XPATH trên tệp obj/Release/api.xml (như đã nêu trong API Metadata Reference). Từ bài viết đó, có những ví dụ để đổi tên cả hai tên của phương thức &, vì vậy không có nhiều công việc để tôi chèn vào tệp Metadata.xml của mình. Ngoài ra, tôi đã tải xuống tệp OsmBindingDroidExample từ bài viết Binding a Java Library và cũng kiểm tra tệp Metadata.xml của họ.

Dưới đây là XML của tôi để tham khảo cũng như:

<metadata> 
    <attr path="/api/package[@name='com.abc.def']" name="managedName">MyRenamedPackage</attr> 
    <attr path="/api/package[@name='com.abc.def']/class[@name='MyClass']/method[@name='originalJavaMethod']" name="managedName">RenamedDotNetMethod</attr> 
</metadata> 

Vì vậy, bây giờ trong mã NET của tôi, tôi có thể viết:

MyRenamedPackage.MyClass.RenamedDotNetMethod(...); 

Hope this helps!

EDIT:

Tôi đã quen thuộc hơn với bộ công cụ Xamarin và có bản cập nhật để sử dụng dễ dàng hơn.

Để hạn chế sự tham gia của mã cần tương tác với các phương thức jar, Xamarin cho phép bạn tạo các lớp C# trong thư mục Bổ sung.Vì vậy, tôi đã tạo ra một lớp trình bao bọc cho thấy các phương thức trong một lớp C# được quản lý mà các dự án khác có thể truy cập. Vì nó là C# không có khiếu nại từ Visual Studio.

Đây là những gì một lớp wrapper sẽ trông giống như đi với ví dụ trước đây của tôi (rõ ràng bạn muốn chọn một tên có ý nghĩa hơn đối với các nhiệm vụ trong tầm tay):

public class InovcationWrapper 
{ 
    public static void InvokeMethod(...) 
    { 
     MyRenamedPackage.MyClass.RenamedDotNetMethod(...); 
    } 
} 

Sau đó trong mã dự án của bạn, bạn muốn có đầy đủ intellisense nếu bạn chỉ cần gọi lớp wrapper của bạn:

InvocationWrapper.InvokeMethod(...); 

Điều này giúp bạn làm việc dễ dàng hơn và hạn chế số lượng squiggles đỏ bị bỏ qua trong mã của bạn. Hi vọng điêu nay co ich!

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