Tôi đang định nghĩa một lớp java từ C với lời gọi JNI DefineClass() và sau đó tôi đăng ký gọi lại gốc cho các phương thức trong lớp tự nhiên. Lớp này có hai phương thức tĩnh, cả hai đều là native. Tôi sử dụng RegisterNatives() để đăng ký các hàm gốc. Cả hai cuộc gọi đều thành công.Tôi đang định nghĩa một lớp Java từ C với DefineClass() nhưng nhận được UnsatisfiedLinkError
Nhưng khi tôi tham khảo những phương pháp có nguồn gốc từ mã Java của tôi tôi nhận được java.lang.UnsatisfiedLinkError myPackage.myClass.myMethod (I) V
Nhưng tôi biết rằng DefineClass trở một đối tượng lớp cho myPackage.myClass và tôi biết rằng myMethod (I) V đã được đăng ký làm phương thức cho lớp đó.
Tôi nhận được lỗi này cũng giống như sắp thực hiện lệnh main() - khi cuộc gọi đến phương thức gốc của tôi là (hiện tại, để kiểm tra).
Là một thử nghiệm, tôi đã thử gọi DefineClass hai lần trên cùng một JNIEnv để xem điều gì đã xảy ra. Tôi nhận được một lỗi định nghĩa lớp trùng lặp. Tôi cũng đã thử gọi FindClass() sau khi xác định nó và JNIEnv trả về một tham chiếu đến lớp đã định nghĩa.
Vì vậy, tôi tạo độ ổn định cho lớp một cách linh hoạt, nhưng nó không thành công khi tôi cố gắng tham khảo các phương pháp của nó.
Bất kỳ ý tưởng nào? Tất cả đầu vào đều được đánh giá cao.
Nền tảng: Windows, 32 bit mã trên 64 bit XP.
Bạn có thể có phiên bản dll cũ hơn ở đâu đó trong đường dẫn của mình không? –
Khi bạn biên soạn DLL của bạn, bạn đã xuất các chức năng? –
Romain: Chức năng của tôi không cần xuất và phiên bản DLL không liên quan - DLL đăng ký các chức năng với RegisterNatives() là DLL cung cấp các chức năng. Các hàm theo định nghĩa có sẵn tại thời điểm RegisterNatives() được gọi. –