Slide_00 - Hieu ung

Download Report

Transcript Slide_00 - Hieu ung

www.hcmus.edu.vn
LOGO
Đại Học Khoa Học Tự Nhiên
Khoa Công Nghệ Thông Tin
Thầy Nguyễn Văn Khiết
0812223 - Trần Minh Khánh
0812333 - Nguyễn Hiếu Nghĩa
0912237 - Trần Duy Khương
www.hcmus.edu.vn
1
Tổng quan về Java Native Interface
2
Cơ bản lập trình Java Native Interface
3
Giới thiệu thư viện Java Native Access
4
Demo ứng dụng thao tác Registry
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
3
www.hcmus.edu.vn
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
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
Chương
trình Java
Java Virtual
Machine
inplement (JNI)
Thư viện
dll
Host environment
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
www.hcmus.edu.vn
 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
 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
Java
class
javac
java
Dynamic
library
2
Java
source
7
javah
1
3
6
linker
C/C++
header
Binary
object
4
jni.h
5
C/C++
source
compiler
9
www.hcmus.edu.vn
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
 Numeric Parameters
JAVA programming
C programming
Bytes
boolean
jboolean
1
byte
jbyte
1
char
jchar
2
short
jshort
2
Int
jint
4
jlong
8
long
float
double
jfloat
4
jdouble
8
11
www.hcmus.edu.vn
String Parameters
JNI 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.
•
•
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
12
www.hcmus.edu.vn
Array
JNI 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.
•
•
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
13
www.hcmus.edu.vn
 Để 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
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
15
www.hcmus.edu.vn
 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ư:
Kiểu dữ liệu
Field Descriptors
int
I
float
F
double
D
boolean
Z
16
www.hcmus.edu.vn
 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.String
Có 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
 Đầ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
Call<Type>Method
<NativeType>
CallVoidMethod
void
CallObjectMethod
jobject
CallBooleanMethod
jboolean
CallByteMethod
jbyte
CallCharMethod
jchar
CallShortMethod
jshort
CallIntMethod
jint
CallLongMethod
jlong
CallFloatMethod
jfloat
CallDoubleMethod
jdouble
19
www.hcmus.edu.vn
 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;
20
www.hcmus.edu.vn
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…
21
www.hcmus.edu.vn
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
22
www.hcmus.edu.vn
 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, ...);
23
www.hcmus.edu.vn
 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.
24
www.hcmus.edu.vn
 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);
25
www.hcmus.edu.vn
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
Demo
27
www.hcmus.edu.vn
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
Demo
29
www.hcmus.edu.vn
Demo
30
www.hcmus.edu.vn
LOGO