NDK android
NDK là một tập hợp các công cụ cho phép nhúng code C/C++ vào ứng
dụng Android. Code C/C++ sẽ được biên dịch ra thành những thư viện
Linux. Những đoạn code viết bằng C/C++ sẽ được chạy trực tiếp không qua
máy ảo Dalvik, do đó làm tăng tốc độ thực thi của chương trình. Bên cạnh
đó, có nhiều thư viện được viết bằng C/C++, do đó có thể sử dụng được
những thư viện này ngay trên Android.
NDK cung cấp một số hỗ trợ sau:
o 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++.
o 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.
o Tài liệu, ví dụ và một số hướng dẫn.
o 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++.
Khi nào thì dùng 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 lập trình nếu nó là
cần thiết đối với ứng dụng của mình không nên vì chúng ta thích chương trình
trong C/C++.
- Framework 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:
• 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:
- 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 1 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.
dụng Android. Code C/C++ sẽ được biên dịch ra thành những thư viện
Linux. Những đoạn code viết bằng C/C++ sẽ được chạy trực tiếp không qua
máy ảo Dalvik, do đó làm tăng tốc độ thực thi của chương trình. Bên cạnh
đó, có nhiều thư viện được viết bằng C/C++, do đó có thể sử dụng được
những thư viện này ngay trên Android.
NDK cung cấp một số hỗ trợ sau:
o 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++.
o 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.
o Tài liệu, ví dụ và một số hướng dẫn.
o 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++.
Khi nào thì dùng 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 lập trình nếu nó là
cần thiết đối với ứng dụng của mình không nên vì chúng ta thích chương trình
trong C/C++.
- Framework 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:
• 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:
- 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 1 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.
No comments: