2012-02-24 27 views
11

Làm cách nào để chỉ định tham số chữ ký chức năng GetMethodID chức năng tôi nhận được id để chấp nhận mảng của một lớp tùy chỉnh?Làm thế nào để xác định mảng của lớp trong tham số chữ ký phương thức GetMethodID?

tôi có một chức năng trong java với chữ ký:

void getData(ListDataClass[] arryData) 

Và tôi muốn có được id phương pháp của chức năng này từ giao diện JNI sử dụng GetMethodID chức năng.
Ví mà tôi đã đề cập trong thông số chữ ký chức năng như sau:

"([myPackeg/ListDataClass)V" 

Nhưng điều này không làm việc và tôi nhận được ngoại lệ như Method Not Found. Cùng một điều hoạt động nếu tôi chỉ định mảng của lớp chuỗi.

+0

Bạn đang gọi từ các chủ đề chính hoặc từ một thread khác nhau? Nếu bạn đang gọi từ một chủ đề khác (chẳng hạn như một chủ đề bạn đã tạo bên trong mã nguồn gốc của mình), bạn sẽ cần phải làm những việc bổ sung. –

+0

@ Alex bạn có ý gì khi nói những điều bổ sung? Tôi đang gọi từ chủ đề khác nhau và có điều gì đó sai. – nabroyan

Trả lời

23

JNI loại chữ ký cho đầy đủ trình độ lớp học mang hình thức:

Lclass/path/ClassName; 

Ví dụ:

"Ljava/lang/String;" // String 
"[Ljava/lang/String;" // String[] (array) 

Một chữ ký phương pháp được xây dựng từ những bằng cách đặt đối số trong ngoặc đơn đầu tiên và trở về loại sau khi khung bên phải. Ví dụ:

long f (int n, String s, int[] arr); // Java method 
"(ILjava/lang/String;[I)J" // JNI type signature 

Bạn có thể tìm thấy những tài liệu cho cho JNI loại chữ ký here, đó là nơi tôi mượn ví dụ trên từ.

Trong ví dụ cụ thể của bạn:

void getData(ListDataClass[] arryData) // Java method 
"([Lclass/path/ListDataClass;)V" // JNI type signature 

Lưu ý: các loại chữ ký chính xác phụ thuộc vào đường dẫn lớp của bạn.

Sau đó bạn có thể tìm ra phương pháp ID như sau (giả sử C++ và một JNIEnv con trỏ gọi env):

jclass clz = env->FindClass("class/path/ListDataClass"); 
jmethodID mid = env->GetMethodID(clz, "getData", "([Lclass/path/ListDataClass;)V"); 
+0

bạn có lỗi đánh máy: '([Lclass/path/ListDataClass;) V', không phải' (L [class/path/ListDataClass;) V' – ankhzet

+0

cố định rằng, cảm ơn – GooseSerbus

Các vấn đề liên quan