340 likes | 907 Views
Đạ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ì?
E N D
Đạ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 www.hcmus.edu.vn
www.hcmus.edu.vn Nội dung thuyết trình 1 2 3 4
www.hcmus.edu.vn 1 Tổng quan JNI • 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
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++).
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++).
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. 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.
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
www.hcmus.edu.vn 2.1 Các bước lập trình JNI cơ bản Java class java javac Dynamic library 7 2 Java source javah 1 3 linker 6 Binary object jni.h C/C++ header 4 5 C/C++ source compiler
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
www.hcmus.edu.vn 2.2 kiểu dữ liệu cơ bản • Numeric Parameters
www.hcmus.edu.vn 2.2 kiểu dữ liệu cơ bản • String Parameters JNI dùng jstring để biểu diễn kiểu String. Jstringkhông được sử dụng bình thường như trong C mà phải qua các phương thức trong JNI.
www.hcmus.edu.vn 2.2 kiểu dữ liệu cơ bản • 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.
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);
www.hcmus.edu.vn 2.3.1 truy xuất Field
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ư:
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.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
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, ...);
www.hcmus.edu.vn 2.3.2 truy xuất method
www.hcmus.edu.vn 2.3.2 truy xuất method • 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 • 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 Trong JNI có thể gọi hàm của lớp cha (khi dùng đa hình) bằng hàm:
www.hcmus.edu.vn 2.3.Tạo dựng đối tượng java trong jni • 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 • 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 • 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)
www.hcmus.edu.vn 2.6 demo Hello world 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.
www.hcmus.edu.vn 3.2 Demo Hello world với JNA Demo
www.hcmus.edu.vn 4 demo ứng dụng thao tác registry Demo
Question ? END !Thank YOU ! Nghĩ thôi ^_^ www.hcmus.edu.vn