31
LOGO Thầy Nguyễn Văn Khiết JAVA NATIVE INTERFACE (JNI) 0812223 - Trần Minh Khánh 0812333 - Nguyễn Hiếu Nghĩa 0912237 - Trần Duy Khương Đại Học Khoa Học Tự Nhiên Khoa Công Nghệ Thông Tin www.hcmus.edu.vn

Java Native Interface ( JNI )

  • 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

Page 1: Java Native Interface  ( JNI )

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

Page 2: Java Native Interface  ( JNI )

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

Page 3: Java Native Interface  ( JNI )

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

Page 4: Java Native Interface  ( JNI )

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

Page 5: Java Native Interface  ( JNI )

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

Page 6: Java Native Interface  ( JNI )

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

Page 7: Java Native Interface  ( JNI )

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

Page 8: Java Native Interface  ( JNI )

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

Page 9: Java Native Interface  ( JNI )

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

Page 10: Java Native Interface  ( JNI )

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

Page 11: Java Native Interface  ( JNI )

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

Page 12: Java Native Interface  ( JNI )

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

Page 13: Java Native Interface  ( JNI )

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

Page 14: Java Native Interface  ( JNI )

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

Page 15: Java Native Interface  ( JNI )

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

Page 16: Java Native Interface  ( JNI )

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

Page 17: Java Native Interface  ( JNI )

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

Page 18: Java Native Interface  ( JNI )

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

Page 19: Java Native Interface  ( JNI )

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

Page 20: Java Native Interface  ( JNI )

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;

Page 21: Java Native Interface  ( JNI )

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…

Page 22: Java Native Interface  ( JNI )

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

Page 23: Java Native Interface  ( JNI )

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, ...);

Page 24: Java Native Interface  ( JNI )

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.

Page 25: Java Native Interface  ( JNI )

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);

Page 26: Java Native Interface  ( JNI )

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

Page 27: Java Native Interface  ( JNI )

www.hcmus.edu.vn

2.6 DEMO HELLO WORLD

27

Demo

Page 28: Java Native Interface  ( JNI )

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

Page 29: Java Native Interface  ( JNI )

www.hcmus.edu.vn

3.2 DEMO HELLO WORLD VỚI JNA

29

Demo

Page 30: Java Native Interface  ( JNI )

4 DEMO ỨNG DỤNG THAO TÁC REGISTRY

www.hcmus.edu.vn

30

Demo

Page 31: Java Native Interface  ( JNI )

LOGO

END !THANK YOU !

NGHĨ THÔI ^_^

QUESTION ?

www.hcmus.edu.vn