Tôi có một ứng dụng Windows MFC rằng:JNI_CreateJavaVM() thất bại mỗi khi khác tôi chạy ứng dụng của tôi (chính xác)
(1) Nạp JVM (JNI_CreateJavaVM()
)
(2) Gắn các chủ đề chính để JVM (AttachCurrentThread()
)
(3) Nạp một số lớp Java và phương pháp (FindClass()
và GetMethodID()
/GetStaticMethodID()
)
(4) Thanh ghi một số callbacks mẹ đẻ để sử dụng bởi mã Java (RegisterNatives()
)
(5) tách sợi từ JVM (DetachCurrentThread()
)
(6) Phá hủy JVM (DestroyJavaVM()
)
Tất cả các chức năng trên thành công mỗi lần khác Tôi chạy ứng dụng. Tôi biết họ thành công, bởi vì, ngoài ra, tôi tương tác với ứng dụng và gọi thành công các phương thức tĩnh Java, và các phương thức Java này gọi thành công các callback gốc của tôi. Ứng dụng của tôi thoát ra một cách duyên dáng và chắc chắn rằng các hàm Java dự kiến và các cuộc gọi lại tự nhiên đã được thực hiện.
Tuy nhiên, mỗi lần khác mà tôi chạy ứng dụng, cuộc gọi đến JNI_CreateJavaVM()
không thành công (không điền JavaVM *
). Hoàn toàn không có gì thay đổi giữa các lần chạy ứng dụng. Tôi chỉ cần chạy nó một lần (thành công, thậm chí mà không cần làm bất cứ điều gì ngoại trừ 6 bước trên), thoát một cách duyên dáng, chạy lại và không thành công, qua lại. Không có ngoại lệ đối với sự thành công/thất bại về sau-và-ra - tôi có thể chạy nó hàng chục lần, và nó dao động chính xác vào mọi thời điểm khác giữa thành công, và thất bại trên đường dây JNI_CreateJavaVM()
.
Nếu cần, tôi sẽ dán thêm mã. Tuy nhiên, tôi hy vọng ai đó có một cái nhìn sâu sắc với những gì tôi đã cung cấp. (Lưu ý: đây là ứng dụng thuộc tính BCGSoft MFC, mặc dù tôi rất nghi ngờ vấn đề đó.)
Và bởi "mỗi khi tôi chạy ứng dụng" bạn thực sự có nghĩa là bạn bắt đầu toàn bộ quá trình mỗi lần, phải không? Không chỉ có hai cuộc gọi phương thức trong một quy trình đơn lẻ? –
Chính xác. Trong trường hợp của tôi, tôi chạy trong chế độ Debug và nhấn F5 trong Visual Studio để chạy ứng dụng. Sau đó, tôi thoát khỏi ứng dụng hoàn toàn. –
Tôi nghĩ rằng ít nhất là chỉnh sửa và thêm mã gọi JNI_CreateJavaVM, đặc biệt là cách bạn cư trú các arg. –