Aug 18
Sau đây là cách dùng JNI cơ bản, saigon cũng có viết 1 vị dụ trong file đính kèm:

Tóm tắt các bứơc:
- tạo file java, khai báo hàm native trên java
- compile file java-->sinh ra file .class
- từ file .class, generate file .h của C bằng công cụ javah
- hiện thực hàm trong C-->tạo file .c
- compile file .c sang .dll bằng công cụ cl của visual studio.
- chạy chương trình trên java từ file .dll của C và file .class của JAVA

Công cụ cần: Visual C++, JDK


Cụ thể:


-tạo file java Hello.java
  
Trích:
                
                import java.util.*;

class Hello {
   //Native method declaration
   native void sayHello(String name);
   //Load the library
   static {
     System.loadLibrary("Hello");
   }
   public static void main(String args[]) {
      //Create class instance
      Hello h=new Hello();
      //Call native method to print the string "saigonkosao"
      h.sayHello("saigonkosao");
        }
}            
+native void sayHello(String name);
trong chtrình java này, ta khai báo phương thức sayHello nhưng ko hiện thực phương thức này trong java mà hiện thực trong C, trên java chỉ khai báo và gọi phương thức này. phương thức này đc gọi là phương thức native. chú ý từ khóa native đầu khai báo. Phương thức này nhận 1 tham số chuỗi.

+  static {
     System.loadLibrary("Hello");
   }

Hàm sayHello được hiện thực trong C dưới dạng 1 dll (dynamic library), do đó để có thể gọi hàm này ta cần load dll lên, dùng System.loadLibrary.

+ trong chương trình chính (main), mình chỉ tạo 1 lớp hello và gọi phương thức sayHello để in ra chữ saigonkosao.

- Sau khi tạo file Java, mình bắt đầu hiện thực phương thức sayHello trong C.
+ Compile file .java: javac Hello.java
+ Tạo header file (.h) cho C: gõ lệnh javah Hello
==>sau bước này file Hello.h của C đc tạo ra có nội dung như sau:
JNIEXPORT void JNICALL Java_Hello_sayHello (JNIEnv *, jobject, jstring);
+ Tạo file Hello.c để hiện thực hàm trên, nội dung:
  
Trích:
                
                #include <jni.h>
#include "Hello.h"
static void printString(JNIEnv *env, jstring jstr)
{
    const char * str = (*env)->GetStringUTFChars(env, jstr, 0);
    printf("%s\n", str);
    (*env)->ReleaseStringUTFChars(env, jstr, str);
}

JNIEXPORT void JNICALL Java_Hello_sayHello (JNIEnv *env, jobject jobj, jstring name){
    printString(env,name);
}
            
Trong hàm Java_Hello_sayHello mình gọi printString để in 1 chuỗi ra màn hình. Thực chất hàm printString chỉ xuất chuỗi tham số ra màn hình(dùng hàm printf của C)

- Compile file Hello.c bằng tool cl của visual C++: trong màn hình command line gõ:

C:\Program Files\Microsoft Visual Studio 8\VC\bin>cl -I "C:\Program Files\Java\jdk1.5.0_04\include" -I "C:\Program Files\Java\jdk1.5.0_04\include\win32" -LD "C:\Program Files\Java\jdk1.5.0_04\bin\Hello.c"
+ Trong câu lệnh trên cần include 2 thư viện C:\Program Files\Java\jdk1.5.0_04\include và C:\Program Files\Java\jdk1.5.0_04\include\win32 (dùng option -I)
+ -LD "Đường dẫn đến file C"

==>file Hello.dll , Hello.lib được  tạo ra

- Chạy chương trình bằng cách gõ : java Hello
(nhớ chép Hello.class và Hello.dll trong cùng 1 thư mục:D)

Các bạn làm, nghiền ngẫm để hiểu cơ chế của nó trước nhé. Đây là 1 vd đơn giản về JNI mà saigon viết giúp các bạn hình dung sơ sơ về JNI. Những v/đề khó hơn mình sẽ bàn sau.

Mọi tham khảo về JNI nằm ở link sau:http://java.sun.com/j2se/1.5.0/docs/...ec/jniTOC.html

Thân!
Tự viết Nhận xét(0) | Trích dẫn(0) | Đọc(75)
Viết nhận xét
Tên gọi [Đăng ký]
Mật khẩu Khách không cần mật khẩu
Địa chỉ web
Email
Mở HTML Mở UBB Mở hình vui Ẩn giấu Hãy nhớ