Bắt đầu sử dụng JNI để gọi các phương thức java tĩnh từ C++. Cụ thể, sau khi nhận được một lớp jclass (sử dụng FindClass) và một jmethodID (bằng cách sử dụng GetStaticMethodID), tôi đã tiếp tục gọi cho chuỗi CallStatic * MethodA routine. Hóa ra rằng tất cả các thường trình này lấy một lớp jclass làm tham số đầu tiên. Tôi bắt đầu tự hỏi tại sao đối tượng lớp là cần thiết: vì tất cả các thông tin được cung cấp trong GetStaticMethodID, đối tượng lớp có vẻ không cần thiết cho JVM để hoàn thành công việc. Sau đó tôi đã thử gọi những thói quen này trong khi truyền NULL cho tham số đầu tiên và lời gọi đã thành công.JNI Gọi các phương thức tĩnh. Đối tượng lớp có cần thiết không?
Câu hỏi của tôi: Có an toàn khi gọi các phương thức này với đối tượng lớp NULL không?
Ưu đãi là: Nếu nó thực sự là hợp pháp, tôi sẽ không phải cache đối tượng lớp cho các cuộc gọi tiếp theo đến các phương thức tĩnh (trong khi nhớ gọi NewGlobalRef ....). Caching jmethodID sẽ là đủ.
Dalvik [không sử dụng tham số jclass] (https://android.googlesource.com/platform/dalvik.git/+/android-4.2.2_r1/vm/Jni.cpp) trong 'CallStatiC## _ jname ## Method', do đó, nó thực sự xuất hiện như thể đi qua 'NULL' sẽ là ok. Tôi không thể nói bất cứ điều gì về các JVM khác mặc dù. – Michael
Đặc điểm kỹ thuật của JNI nói cần thiết, vì vậy cần thiết. Tôi sẽ không viết mã phụ thuộc vào một quirk của một JVM cụ thể. – EJP
Nó chỉ hoạt động vì phương thức tĩnh của bạn không gọi các phương thức tĩnh khác từ cùng một lớp, cũng không sử dụng các biến lớp tĩnh! – Christophe