Sunday, February 7, 2021

Làm thế nào để gọi một chương trình C từ Java

 Gọi một chương trình C có thể hữu ích khi chúng ta muốn sử dụng các thư viện C và sử dụng lại một chương trình C hiện có. Khi chúng tôi biên dịch một chương trình C, nguồn sẽ được chuyển đổi thành tệp obj. Nó là một mã máy trung gian phụ thuộc vào nền tảng sẽ được chuyển đổi thành exe và sau đó được thực thi.

Java native interface (JNI) là một khung được cung cấp bởi java cho phép các chương trình java gọi mã gốc và ngược lại.

Sử dụng JNI, một chương trình java có khả năng gọi mã C gốc. Nhưng chúng ta đánh mất mục tiêu cốt lõi của java đó là tính độc lập của nền tảng. Vì vậy, việc gọi một chương trình C từ java nên được sử dụng một cách thận trọng.

JNI cung cấp đặc điểm kỹ thuật và mã gốc phải được viết / chuyển cho phù hợp. Nhà cung cấp JDK nên cung cấp triển khai cần thiết cho JNI.

Các bước để gọi một chương trình C từ Java

1. Viết chương trình Java và biên dịch

2. Tạo tệp tiêu đề từ lớp java

3. Viết chương trình C

4. Tạo tệp thư viện chia sẻ

5. Chạy chương trình Java

1. Viết chương trình Java

public class JavaToC {


    public native void helloC();


    static {

        System.loadLibrary("HelloWorld");

    }


    public static void main(String[] args) {

        new JavaToC().helloC();

    }

}

Lưu ý hai điều trong chương trình này,

Sử dụng từ khóa gốc. Đây là một khai báo phương thức và nó thông báo cho trình biên dịch java rằng việc triển khai cho phương thức này là một phương thức gốc. Phương thức helloC () này có trong tệp nguồn C và đó là những gì chúng ta sẽ gọi.

Đang tải thư viện HelloWorld bằng từ khóa tĩnh . Tệp thư viện này sẽ được biên dịch từ nguồn C trong các bước tiếp theo.

2. Tạo tệp tiêu đề từ lớp java

JDK cung cấp một công cụ có tên javah có thể được sử dụng để tạo tệp tiêu đề.

Chúng tôi sẽ sử dụng tệp tiêu đề đã tạo như bao gồm trong nguồn C.

Nhớ biên dịch chương trình java trước khi sử dụng javah

javah JavaToC

Sau đây là tệp tiêu đề được tạo,

/* DO NOT EDIT THIS FILE - it is machine generated */ #include /* Header for class JavaToC */ #ifndef _Included_JavaToC #define _Included_JavaToC #ifdef __cplusplus extern "C" { #endif /* * Class:     JavaToC * Method:    helloC * Signature: ()V */ JNIEXPORT void JNICALL Java_JavaToC_helloC (JNIEnv *, jobject); #ifdef __cplusplus } #endif
#endif

3. Viết chương trình C

#include #include #include "JavaToC.h" JNIEXPORT void JNICALL Java_JavaToC_helloC(JNIEnv *env, jobject javaobj) { printf("Hello World: From C"); return; }

stdio.h là tệp tiêu đề C tiêu chuẩn bao gồm.

jni.h là tệp tiêu đề cung cấp ánh xạ java sang C và nó có sẵn trong JDK.

JavaToC.h là tệp tiêu đề được tạo từ tệp nguồn java.

4. Tạo Tệp Thư viện Chia sẻ

Bây giờ hãy biên dịch tệp nguồn C ở trên. Chúng tôi cần một trình biên dịch C và tôi đã chọn Tiny C.

Tiny C có thể được tải xuống từ http://mirror.veriportal.com/savannah//tinycc/tcc-0.9.25-win32-bin.zip

Tải xuống và giải nén tệp và đặt đường dẫn hệ điều hành thành tcc.exe

tcc HelloWorld.C -IC: /Progra~1/Java/jdk1.7.0_07/include -IC: /Progra~1/Java/jdk1.7.0_07/include/win32 -shared -o HelloWorld.dll

Trên đây là lệnh tạo tệp thư viện chia sẻ dll được tải trong chương trình java. Hai thư mục được bao gồm trong lệnh biên dịch, chúng bao gồm jni.h và jni_md.h

5. Chạy chương trình Java

Chúng ta đã sẵn sàng, bây giờ hãy chạy chương trình java để nhận được kết quả sau,

Hello World: Từ C

No comments:

Post a Comment