2011-02-10 26 views
5


Tôi bắt đầu xem xét JNI và từ những gì tôi hiểu là nếu xảy ra sự cố với dll đã tải, jvm có thể chấm dứt ngay tại chỗ.
I.e. quy trình không thể được bảo vệ, ví dụ: như khi bắt một ngoại lệ.
Vì vậy, nếu hiểu biết của tôi là chính xác, câu hỏi của tôi là nếu có một cách tiếp cận/mẫu chuẩn cho tình huống này khi sử dụng jni.
Hoặc để nói rõ nó khác nhau, là các quá trình sử dụng jni được thiết kế theo cách để tránh những vấn đề này? Hoặc các vấn đề như vậy sẽ không xảy ra?câu hỏi bắt đầu jni

Cảm ơn bạn.

Trả lời

3

Có, JVM sẽ chỉ chấm dứt đó là một trong những lý do khiến mã JNI thực sự khó gỡ lỗi. Nếu bạn đang sử dụng mã C++, bạn có thể sử dụng ngoại lệ và sau đó ánh xạ chúng vào một ngoại lệ Java, ít nhất là cung cấp cho bạn mức độ bảo mật nhưng không hỗ trợ những thứ như truy cập bộ nhớ kém, v.v.

Từ quan điểm kiến ​​trúc Tôi đề nghị bạn tách mã từ JNI càng nhiều càng tốt. Tạo một cấu trúc lớp/thủ tục hoàn toàn có thể kiểm tra từ C++/C và để mã JNI chỉ làm tất cả các công cụ chuyển đổi. Nếu JVM sau đó đổ vỡ bạn ít nhất là biết nơi bạn phải tìm.

+0

Ý tưởng đầu tiên mà tôi nghĩ là đặt bài đăng, đã sinh ra một quy trình mới để truy cập vào dll.Đây là cách mà quy trình gốc tồn tại.Nhưng tôi không chắc chắn nếu điều này được sử dụng như một appoach – Cratylus

+0

Hm, nhưng trong trường hợp đó bạn có thể cũng không sử dụng JNI ở tất cả và chuyển sang một cách khác của quá trình liên lạc liên lạc. Tôi sẽ chỉ sử dụng JNI nếu tốc độ là vấn đề lớn nhất (và sau đó nó không có ý nghĩa để đặt nó trong quá trình riêng của nó). Đó là một thương mại giữa tốc độ và an ninh. – Daff

1

Các nguyên tắc là không có khác nhau từ bất kỳ ứng dụng đa luồng C:

  1. Luôn kiểm tra tất cả các đầu vào của bạn triệt để.
  2. Luôn giải phóng bộ nhớ tạm thời mà bạn đã cấp phát.
  3. Đảm bảo rằng các chức năng của bạn là người tham gia lại.
  4. Không dựa vào hành vi không xác định.

Máy ảo Java cung cấp cho bạn không có thêm bảo vệ cho mã gốc, nếu nó không thành công hoặc bị rò rỉ, máy ảo của bạn sẽ bị lỗi hoặc rò rỉ.

+0

@ Daff: Ý tưởng đầu tiên mà tôi đang nghĩ là đặt bài đăng, đã sinh ra một quy trình mới để truy cập vào dll.Đây là quá trình gốc tồn tại. Nhưng tôi không chắc liệu đây có phải là appoach – Cratylus

+0

@ user384706 Sinh sản một quy trình mới không phải là không có rủi ro của nó mặc dù và nó là không thể chấp nhận chậm cho hầu hết các sử dụng. Ngoài ra, nếu bạn đang bắt đầu một quá trình bên ngoài, tại sao không làm điều đó từ Java thuần túy? – biziclop

+0

Ý tưởng tôi nghĩ rằng mã gốc sẽ được sử dụng trong các trường hợp cụ thể mà không thể thực hiện trong java, quy trình gốc sẽ tạo ra một quy trình mới để truy cập vào dll và mọi kết quả/tin nhắn sẽ được gửi đến quy trình gốc. Nếu một cái gì đó xảy ra quá trình thứ hai chết nhưng quá trình ban đầu mà có thể làm nhiều chức năng hơn (truy cập một dll) chỉ là một phần, vẫn sẽ sống. Không chắc chắn nếu đây là một cách tiếp cận được sử dụng. Có thể là quá nhiều? – Cratylus

0

Bạn có thể có chính xác cùng một phạm vi xử lý lỗi trong thư viện JNI như trong bất kỳ thứ gì khác.

Bạn có thể sử dụng try/catch. Nếu bạn đang sử dụng Windows, bạn có thể sử dụng SEH. Nếu bạn đang sử dụng Linux, bạn có thể gọi sigaction.

Tuy nhiên, nếu bạn lộn xộn và có SIGSEGV, JVM của bạn có lẽ là bánh mì nướng cho dù bạn có cố gắng nắm bắt tín hiệu đó hay không.

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