Upload
darby
View
212
Download
1
Embed Size (px)
DESCRIPTION
Đại Học Khoa Học Tự Nhiên Khoa Công Nghệ Thông Tin. 0812223 - Trần Minh Khánh 0812333 - Nguyễn Hiếu Nghĩa 0912237 - Trần Duy Khương. Java Native Interface ( JNI ). Thầy Nguyễn Văn Khiết. Nội dung thuyết trình. 1. 2. 3. 4. 1 Tổng quan JNI. Java Native Interface (JNI) là gì? - PowerPoint PPT Presentation
Citation preview
LOGO
Thầy Nguyễn Văn Khiết
JAVA NATIVE INTERFACE (JNI)
0812223 - Trần Minh Khánh0812333 - Nguyễn Hiếu Nghĩa0912237 - Trần Duy Khương
Đại Học Khoa Học Tự NhiênKhoa Công Nghệ Thông Tin
www.hcmus.edu.vn
NỘI DUNG THUYẾT TRÌNH
Tổng quan về Java Native Interface
Cơ bản lập trình Java Native Interface
Giới thiệu thư viện Java Native Access
Demo ứng dụng thao tác Registry
1
2
3
4
www.hcmus.edu.vn
2
www.hcmus.edu.vn
Java Native Interface (JNI) là gì?
Mục đích của việc dùng JNI
Cơ chế làm việc trong JNI
Khó khăn khi làm việc với JNI
1 TỔNG QUAN JNI
3
www.hcmus.edu.vn
1.1 JNI LÀ GÌ ?
Java Native Interface (JNI) là một phần nền
tảng của Java, là một interface trung gian cho
phép kết nối ứng dụng Java với các ứng dụng
hoặc thư viện viết bằng ngôn ngữ khác (C, C+
+).
4
www.hcmus.edu.vn
1.2 MỤC ĐÍCH
Sử dụng một ứng dụng, thư viện liên kết
động như C, C++ vào trong chương trình Java.Nhúng máy ảo Java vào các ứng dụng
native (C, C++).
5
www.hcmus.edu.vn
1.3 CƠ CHẾ LÀM VIỆC
Host Environment: là những thiết lập và cài đặt trên máy chủ để chạy ứng dụng JNI.Thư viện .dll: Thư viện .dll phải đạt được tính độc lập riêng .JNI: cầu nối trung gian giữa JAVA & .dll.
6
Chương trình Java
Java Virtual Machine
inplement (JNI)
Thư viện dll
Host environment
www.hcmus.edu.vn
1.4 KHÓ KHĂN
Không còn dễ dàng để chạy trên nhiều
môi trường nữa.
Độ an toàn bị giảm.
7
www.hcmus.edu.vn
2 CỞ BẢN LẬP TRÌNH JNI
Các bước lập trình JNI cơ bản Các kiểu dữ liệu cơ bản Truy xuất biến, hàm giữa code native và
code java Bắt các Exception The Invocation API – nhúng việc khởi tạo
một JVM trong native code (c/c++) Demo chương trình HelloWorld
8
www.hcmus.edu.vn
2.1 CÁC BƯỚC LẬP TRÌNH JNI CƠ BẢN
9
Java source
javacJava class
javah
C/C++ header
C/C++ source
java
Dynamic library
linker
compiler
Binaryobject jni.h
16
54
3
2 7
www.hcmus.edu.vn
2.2 KIỂU DỮ LIỆU CƠ BẢN
Việc tryền và quản lí các biến trong JNI khá phức tạp.
Để biểu diễn kiểu dữ liệu chung JNI tạo ra một vài kiểu dữ liệu trung gian như sau :
jobject jboolean jbyte
jchar jshort jint
jlong jstring jfloat
10
www.hcmus.edu.vn
2.2 KIỂU DỮ LIỆU CƠ BẢN
Numeric Parameters
11
JAVA programming C programming Bytes
boolean jboolean 1
byte jbyte 1
char jchar 2
short jshort 2
Int jint 4
long jlong 8
float jfloat 4
double jdouble 8
www.hcmus.edu.vn
2.2 KIỂU DỮ LIỆU CƠ BẢN
String ParametersJNI dùng jstring để biểu diễn kiểu String. Jstring không được sử dụng bình thường như trong
C mà phải qua các phương thức trong JNI.
12
• GetStringChars• ReleaseStringChars
Lấy chuỗi String thường
• GetStringUTFChars• ReleaseStringUTFChars
Lấy ra chuỗi String UTF
• GetStringLength• GetStringUTFLength
Trả về độ dài chuỗi String
• NewString• NewStringUTF
Tạo chuỗi String mới
• GetStringCritical• ReleaseStringCritical
Lấy chuỗi String từ con trỏ truyền vào
www.hcmus.edu.vn
2.2 KIỂU DỮ LIỆU CƠ BẢN
ArrayJNI sử dụng jarray để thao tác với mảng.Phải sử dụng các phương thức jarray thích hợp trong
JNI để truy cập mảng.
13
• Get<Type>ArrayRegion• Set<Type>ArrayRegion
Lấy ra mảng từ 1 mảng căn bản
• Get<Type>ArrayElements• Release<Type>ArrayElement
Nhận và hủy 1 phần tử mảng
• GetArrayLength Trả về số phần tử mảng
• New<Type>Array Tạo mảng mới
• GetPrimitiveArrayCritical• ReleasePrimitiveArrayCritical
Nhận và hủy 1 mảng từ biến con trỏ gửi vào
www.hcmus.edu.vn
2.3.1 TRUY XUẤT FIELD
Để get một Field JNI ta dùng các hàm sau:(*env)->GetAAAField(env, jclass, fieldID);
Để set giá trị cho Field JNI ta dùng hàm sau:Prototype void Set<Type>Field(JNIEnv *env,
jobject obj, jfieldID, fielđI, <NativeType> value);
14
www.hcmus.edu.vn
2.3.1 TRUY XUẤT FIELD
15
Get<Type>Field / Set<Type>Field <NativeType>
GetObjectField / GetObjectField jobject
GetBooleanField / GetBooleanField jboolean
GetByteField / GetByteField jbyte
GetCharField / GetCharField jchar
GetShortField / GetShortField jshort
GetIntField / GetIntField jint
GetLongField / GetLongField jlong
GetFloatField / GetFloatField jfloat
GetDoubleField / GetDoubleField jdouble
www.hcmus.edu.vn
2.3.1 TRUY XUẤT FIELD
Field Descriptors
Là một chuỗi để biểu diễn kiểu dữ liệu của field.
Với các kiểu cơ bản mô tả sẽ đơn giản như:
16
Kiểu dữ liệu Field Descriptors
int I
float F
double D
boolean Z
www.hcmus.edu.vn
2.3.1 TRUY XUẤT FIELD
Field Descriptors Với các kiểu dữ liệu khác thì mô tả theo package
name của nó.VD: kiểu String thuộc package: java.lang.StringCó chuỗi mô tả tương ứng: “Ljava/lang/String;”
Có một cách khác để biết chuỗi mô tả của các filed trong lớp java là dùng tool javap đi kèm trong JDK với tham số -s -p TenClass
17
www.hcmus.edu.vn
2.3.2 TRUY XUẤT METHOD
Đầu tiên ta cần có MethodId của method cần gọi bằng cách gọi hàm:
jmethodID GetMethodID(JNIEnv *env, jclass clazz, const char *name, const char *sig);
Gọi method bằng hàm sau: Prototype <NativeType> Call<Type> Method(JNIEnv *env, jobject obj, jmethodID methodID, ...);
18
www.hcmus.edu.vn
2.3.2 TRUY XUẤT METHOD
19
Call<Type>Method <NativeType>
CallVoidMethod void
CallObjectMethod jobject
CallBooleanMethod jboolean
CallByteMethod jbyte
CallCharMethod jchar
CallShortMethod jshort
CallIntMethod jint
CallLongMethod jlong
CallFloatMethod jfloat
CallDoubleMethod jdouble
www.hcmus.edu.vn
2.3.2 TRUY XUẤT METHOD
20
Method descriptor
Là một chuỗi tương tự như prototype của method nhưng có mô tả khác. Gồm 2 phần “(?)?”:
Chấm hỏi thứ nhất là phần các tham số truyền vào method.
Chấm hỏi thứ hai là giá trị trả về.
Ví dụ:
“()V”
“(I)I”
“(Ljava/lang/String;)Ljava/lang/String;
www.hcmus.edu.vn
2.3.1 TRUY XUẤT METHOD
21
Gọi static method
Hoàn toàn giống với gọi hàm của object.
Chỉ khác nhau ở tên hàm trong JNI như thay vì
gọi GetMethodID, CallVoidMethod… thì sẽ gọi
GetStaticMethodID, CallStaticVoidMethod…
www.hcmus.edu.vn
2.3.1 TRUY XUẤT METHOD
22
Trong JNI có thể gọi hàm của lớp cha (khi dùng đa hình) bằng hàm:
CallNonvirtual<Type>Method <NativeType>
CallNonvirtualVoidMethod Void
CallNonvirtualObjectMethod jobject
CallNonvirtualBooleanMethod jboolean
CallNonvirtualByteMethod jbyte
CallNonvirtualCharMethod jchar
CallNonvirtualShortMethod jshort
CallNonvirtualIntMethod jint
CallNonvirtualLongMethod jlong
CallNonvirtualFloatMethod jfloat
CallNonvirtualDoubleMethod jdouble
www.hcmus.edu.vn
2.3.TẠO DỰNG ĐỐI TƯỢNG JAVA TRONG JNI
23
JNI cho phép ta lấy được hàm dựng của một đối tượng qua đó tạo dựng được đối tượng Java.
Để tạo đối tượng với hàm dựng có được ta gọi hàm:
jobject NewObject(JNIEnv *env, jclass clazz, jmethodID methodID, ...);
www.hcmus.edu.vn
2.4 BẮT CÁC EXCEPTION
24
Throw một ngoại lệ cho chương trình java.JNI cung cấp hai hàm để throw lỗi:
jint Throw(JNIEnv *env, jthrowable obj);jint ThrowNew(JNIEnv *env, jclass clazz, const char
*message);
Lưu ý: là khi Throw một ngoại lệ thì native code vẫn tiếp tục chạy. Khi kết thúc hàm native thì JVM mới phát sinh ra ngoại lệ. Nên nếu muốn native code không chạy tiếp khi có ngoại lệ thì cần gọi return ngay sau lệnh Throw.
www.hcmus.edu.vn
2.4 BẮT CÁC EXCEPTION
25
Nhận ngoại lệ từ chương trình Java
JNI cung cấp hai hàm kiểm tra xem có ngoại lệ xảy ra không và hàm lấy về đối tượng ngoại lệ:
jboolean ExceptionCheck(JNIEnv *env);
jthrowable ExceptionOccurred(JNIEnv *env);
www.hcmus.edu.vn
2.5 THE INVOCATION API
Invocation API của JVM sẽ giúp chúng ta tạo một Java Virtual Machine trong chương trình C/C++.
Hàm để tạo và hủy máy ảo java trong JNI.
Tạo:jint JNI_CreateJavaVM(JavaVM** p_jvm,
void** p_env, JavaVMInitArgs* vm_args)
Hủy:jint DestroyJavaVM(JavaVM* jvm)
26
www.hcmus.edu.vn
2.6 DEMO HELLO WORLD
27
Demo
www.hcmus.edu.vn
3.1 JAVA NATIVE ACCESS
Java Native Access (JNA) là một phần mở
rộng của Java cho phép sử dụng các API bao
gồm các tập tin thư viện động DLL trong
Windows mà không cần sử dụng đến JNI.
28
www.hcmus.edu.vn
3.2 DEMO HELLO WORLD VỚI JNA
29
Demo
4 DEMO ỨNG DỤNG THAO TÁC REGISTRY
www.hcmus.edu.vn
30
Demo
LOGO
END !THANK YOU !
NGHĨ THÔI ^_^
QUESTION ?
www.hcmus.edu.vn