PDA

View Full Version : Tổng quan NDK android



haian
08-09-2011, 11:24 PM
Giới thiệu về NDK
Là bộ công cho phép nhúng các mã code lên các ứng dụng android. ứng dụng Android chạy trong máy ảo Dalvik. NDK cho phép chúng ta dùng các ứng dụng viết bằng ngôn ngữ C và C++ lên thiết bị android.
NDK cung cấp một số hỗ trợ sau: • Một tập hợp các Toos và files build dùng để tạo ra các thư viện mã từ sources C và
C++.
• Cách để nhúng các thư viện mã vào một file (.apk) gói ứng dụng mà chúng ta có thể chạy được trên các thiết bị android.
• Tài liệu, ví dụ và một số hướng dẫn.
• Một bộ các thư viện C/C++ được hỗ trợ trong tất cả các phiên bản sau này của hệ điều hành Android, bắt đầu từ Android 1.5. Từ phiên bản 2.3 trở đi, hệ điều hành android còn hỗ trợ them cách viết Activity bằng C/C++.
NDK cung cấp bộ header cho libc ( bột thư viện C ), libm (bột thư viện toán học), openGL ES(thư viện đồ họa 3D), giao diện JNI(là giao diện để liên lạc giữa java và native code), một số thư viện khác, được chứa trong Development Tools.
Khi nào thì Native code Không phải khi nào NDK cũng đều có lợi với tất cả các ứng dụng. Vì vậy chúng ta cần
cân bằng lợi ích với nhược điểm của nó. Đặc biệt trong trường hợp sử dụng native code không làm tăng hiệu suất thực thi mà làm tăng sự phức tạp của ứng dụng. Nói chung chỉ nên sử dụng native code nếu nó là cần thiết đối với ứng dụng của mình. Chứ không phải vì chúng ta thích chương trình trong C/C++.
Frame android cung cấp 2 cách để dùng native code : • Dùng Android framework để viết ứng dụng của mình và dùng JNI để truy cập API
được cung cấp bởi Android NDK. Kỹ thuật này cho phép chúng ta tận dụng các tiện ích của

Android framework, nhưng vẫn cho phép chúng ta viết native code khi cần thiết. Chúng ta có thể cài ứng dụng sử dụng Native code thông qua JNI trên thiết bị chạy android 1.5 hoặc mới hơn.
• Viết một native activity, cho phép chúng ta thực hiện cài đặt vòng đời của ứng dụng android trên native code. Android SDK cung cấp lớp NativeActivity cho phép chúng ta cài đặt vòng đời thông qua các hàm sau (onCreate(), onResume(), ..).
Development tool NDK gồm một bộ công cụ (compilers, linkers, ...) dùng để tạo ra mã nhị phân cho bộ vi
xử lý ARM trên hệ điều hành Linux, OS X, và Windows(với Cygwin). Cung cấp một bộ headers của hệ thống cho các API native chuẩn mà được đảm bảo
được hỗ trợ trong tất cả các phiên bản sau này của nền tảng: • Libc (thư viện C) headers. • Libm (thư viện toán học) headers. • Giao diện JNI headers.
• Liblog (Android logging) header. • OpenGL ES 1.1 và OpenGL ES 2.0(thư viện graphics library) headers. • Libjnigraphics (Pixel buffer access) header(for Android 2.2. trở lên). • Thư viện OpenSL ES native audio. • API cho ứng dụng android.
NDK cũng cung cấp một hệ thống biên dịch giúp chúng ta làm việc hiệu quả với mã nguồn của mình mà không cần điều khiển chi tiết các công cụ/ nền tảng/ CPU/ ABI. Người dùng chỉ cần tạo các file biên dịch đơn giản để mô tả mã nguồn của mình mà trong ứng dụng Android sử dụng. Và hệ thống biên dịch sẽ sử dụng các file này để biên dịch, và tạo ra một thư viện động bỏ trực tiếp vào trong dự án của mình.

Hệ thống và phần mềm yêu cầu • The Android SDK
- Hoàn tất cài đặt một Android SDK (bao gồm tất cả các phụ thuộc). - Phiên bản SDK Android 1.5 trở đi. • Hệ điều hành hỗ trợ - Window XP (32-bit) hoặc vista (32- hoặc 64 -bit).
- Mac Os x10.4.8 hoặc hơn (đối với X86). - Linux (32 hoặc 64 bit, thử nghiệm trên Linux Ubuntu Dapper Drake). • Các công cụ Cần Thiết - Đối với tất cả các nền tảng, bắt buộc GNU Make 3.81 trở lên. - Đối với Window, bắt buộc Cygwin 1.7 trở lên. NDK không làm việc với Cygwin 1.5. • Nền tảng Android tương thích
Các thư viện native được tạo ra bởi Android NDK chỉ có thể sử dụng trên các thiết bị Android phiên bản 1.5 trở đi. Điều này là do Bộ công cụ và ABI liên quan đến những thay đổi làm cho các thư viện native không tương thích với hình ảnh hệ thống 1.0 và 1.1.
Vì lí do này nên chúng ta nên sử dụng thư viện native được tạo ra với NDK trong ứng dụng mà được triển khai trên các thiết bị chạy trên nền tảng android 1.5 trở đi.
Để đảm bảo tính tương thích, một ứng dụng dùng thư viện native tạo ra với NDK phải khai báo <uses- sdk> phần tử trong file mainfese của nó, với một giá trị thuộc tính của android:minSdkVersion 3 hoặc lớn hơn.
Ví dụ:

<manifest>
<uses-sdk android:minSdkVersion="3" />
... </manifest>

Hoạt động của JNI và quy trình biên dịch Như chúng ta đều biết, ứng dụng android chạy trên nền chính là Java. Muốn chạy
C/C++ ta có hai giải pháp:
- Sử dụng JNI: từ android 1.5 trở về sau. - Sử dụng Native Activity: từ android 2.3 trở về sau. Native Activity là phương án lựa chọn tốt hơn, bởi vì chương trình sẽ không tốn chi phí
giao dịch giữa máy ảo Java và C/C++. Tuy nhiên, tới thời điểm hiện tại, số lượng các thiết bị hổ trợ Android 2.3 tương đối hiếm nên chúng ta sẽ sử dụng giải pháp JNI.
Hoạt động của JNI được mô tả như sau:
- Các phương thức JNI được đánh dấu bằng từ khóa native. - Các phương thức này được viết bằng C++ và biên dịch ra thư viện liên kết động .so. - Thư viện liên kết động được Load lên trong chương trình Java bằng lời gọi
System.loadLibrary(...);
- Khi trong chương trình Java có lời gọi tới hàm native, máy ảo Java sẽ tìm kiếm trong thư viện động xem hàm này đã được cài đặt chưa, sau đó các đối tượng Java sẽ được chuyển thành C++ để thực hiện lời gọi tới C++.
- Trong C++ cũng cung cấp các thư viện cho phép giao tiếp tới máy ảo và chương trình Java.
Quy trình xây dựng một chương trình có sử dụng JNI như sau: - Khai báo phương thức native ở trong lớp Java.
- Khai báo và cài đặt phương thức này trong C. (Nếu C++ thì phải sử dụng extern “C” để tránh sửa tên trong C++). Quy tắc đặt tên hàm đó như sau:

-
tengoi_tenlop_tenphuongthuc
Sau đó dùng NDK để biên dịch mã nguồn C thành thư viện liên kết động và thư viện này được tự động bỏ vào thư mục lib của dự án android. Viết chương trình java gọi các hàm native này. Dùng bộ SDK để biên dịch thành ứng dụng apk.
- - Do các bước sử dụng NDK để biên dịch được thực hiện trên dấu nhắc lệnh, do đó chúng
ta sẽ tạo tập tin lệnh để thực hiện điều này.

hardwire
16-09-2011, 12:33 PM
thấy bạn giới thiệu hay quá nhưng tải NDK ở đâu vậy bạn ?

Xcross87
16-09-2011, 08:29 PM
thấy bạn giới thiệu hay quá nhưng tải NDK ở đâu vậy bạn ?

Sẵn trong Android-SDK, vào: http://developer.android.com/ nhé.
Chỉ khi nào cần phải viết ứng dụng hay xử lý cần độ tối ưu cao (enhance/improve performance) như xử lý đồ họa, tối ưu hóa thuật toán...thì hãy dùng native code, còn không chả để làm gì phí phạm tài nguyên.
Không biết Java thì không dùng được NDK đâu nhé, gọi rõ hơn là viết code C++ rồi port native sang Java, gọi là JNI.