tôi phải làm điều này một thời gian ngắn trước đây. Bạn sẽ cần một trình biên dịch C và các tệp tiêu đề Windows. Tôi đã sử dụng mingw vì nó miễn phí và tôi chỉ biên soạn một tập tin nhỏ.
Trước tiên, bạn tạo lớp học. Dưới đây là ví dụ:
package org.whatever.thingy;
public class MyClass {
// Here is a JNI method, identified by 'native'
public static native callWin32Thingy(int x, int y, boolean z);
/* At this point, normal class stuff, other methods, variables, whatever */
}
Sau đó, bạn sử dụng một trong các lệnh đi kèm trong JDK, sẽ tự động lấy lớp của bạn và tạo tệp .h và .c. Lệnh này là "javah". Chữ ký của phương thức sẽ trông giống như sau:
JNIEXPORT void JNICALL Java_com_whatever_1thingy_MyClass_callWin32Thingy
(JNIEnv *, jclass, jint, jint, jboolean);
Trong tệp .c, bạn bao gồm bất kỳ tiêu đề cửa sổ nào bạn cần và xác định phương pháp.
JNIEXPORT void JNICALL Java_com_whatever_1thingy_MyClass_callWin32Thingy
(JNIEnv *a, jclass b, jint c, jint d, jboolean e) {
// Prep steps....
Win32MethodCallWeCareAbout(x, y, z, hWhatever);
// Cleanup stuff...
}
Đó là rất quan trọng bạn không đổi tên phương pháp, đó là cách nó được kết hợp với lớp học cụ thể của bạn.
Khi bạn đã có điều đó, bạn biên dịch các tệp đó thành một tệp DLL. Dưới đây là các lệnh tôi đã sử dụng cho mingw, bạn sẽ phải điều chỉnh các lớp/đường dẫn/etc.
c:/MinGW/bin/gcc -c -Ic:/MinGW/include -I"c:/Program Files/Java/jdk1.5.0_12/include"
-I"c:/Program Files/Java/jdk1.5.0_12/include/win32" -D__int64="long long"
com_whatever_thingy_MyClass_JNIHelper.c
c:/MinGW/bin/gcc -shared -o JNIHelper.dll
com_whatever_thingy_MyClass_JNIHelper_JNIHelper.o
-Wl,--add-stdcall-alias,--kill-at,--output-def,def_file
Điều này sẽ tạo một số tệp, bao gồm JNIHelper.dll, tên tôi đã đặt tên là DLL của tôi.
Tại thời điểm này, về cơ bản bạn đã hoàn tất. Bạn sử dụng lớp Java của bạn như bình thường, và nó sẽ chạy mã Win32 của bạn khi bạn gọi phương thức tĩnh. Tất cả những gì bạn phải làm là nhập thư viện. Một nơi nào đó trong mã của bạn (tôi đặt nó trong một khối tĩnh trong lớp học của tôi), bạn sẽ cần dòng này:
System.loadLibrary("JNIHelper");
Điều này sẽ gây Java để tải các thư viện có tên là "JNIHelper.dll" và liên kết nó vào mã . Nó phải ở đâu đó trong đường dẫn thư viện mà Java biết.
Vậy đó. Đó là một loạt các boilerplate, nhưng nếu bạn đang làm một số gói đơn giản, thật dễ dàng. Nếu bạn phải đối phó với các loại Java hoặc cấp phát bộ nhớ, nó trở nên tồi tệ hơn (lưu ý: tôi đã không, vì vậy tôi không có kinh nghiệm ở đó).
Có cả một hướng dẫn here (lần đầu tiên tôi thấy ngày hôm nay rằng trông đàng hoàng, và bạn có thể tìm thấy những người khác trên web. Các bài viết Wikipedia trên JNI có biết thêm quá.
Hope this helps.
nhu cầu này Một vết sưng - JNA tốt hơn nhiều so với JNI thuần túy để truy cập thư viện gốc –
+1: JNA là lựa chọn tốt Mặc dù, bạn cần tìm ra cách ánh xạ chữ ký hàm trong Java. Gần đây tôi đã sử dụng JNA để giao tiếp với một bluetooth thiết bị thông qua API Win32 bản địa – wierob
JNA thực sự là trơn tru Khi tôi giải thích nó cho một người bạn tại nơi làm việc trong tuần khác, tôi thực sự đã đi xa đến mức để nói với anh ta đó là "ma thuật". – rob