Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
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