2011-08-29 48 views
6

Tôi có câu hỏi nhanh về cách xử lý các trường hợp ngoại lệ được các thư viện theo JNA ...JNA bắt ngoại lệ

Khi tôi ném ngoại lệ vào mã gốc cơ bản, JNA sẽ nhận được lỗi truy cập bộ nhớ không hợp lệ. Tôi giả định này là bởi vì các thư viện C không thể ném một ngoại lệ lên thông qua nó ngăn xếp (nó thực sự C + +/CLR nhưng có C xuất khẩu)? Vì vậy, không có cách nào thực sự để báo cáo ngoại lệ cho Java? Hoặc "nó nên hoạt động" và tôi chỉ làm điều gì đó cực kỳ sai?

DllExport void Initialize(char* dir) 
{ 
    throw gcnew System::Exception("Testing"); 
} 

Nó sẽ được tốt đẹp cho Java để có thể phát hiện những trường hợp ngoại lệ ném, và tôi đoán tôi thực sự có thể nhìn vào đi qua một con trỏ nhớ vào tất cả xuất khẩu C của tôi và kiểm tra xem nếu đó là những null hay không, nhưng có vẻ như một đường vòng.

Trả lời

4

Bạn cần tự xử lý ngoại lệ C++ và thay vào đó xây dựng một ngoại lệ java có thể được chuyển đến bên java của mã.

+0

Vì vậy, tôi muốn bắt nó ở bên C++/CLR, và chuyển nó trở lại vào java như nhiều tham số? (Hoặc trong trường hợp muốn báo cáo lỗi đơn giản, chỉ cần có tham số thứ hai, "char * err" sẽ là đủ). Tôi nghĩ tôi có lẽ phải làm vậy. – StrangeWill

4

Ngoại lệ C++ chỉ có thể được xử lý trong mã C++. Chúng không bao giờ được phép thoát khỏi thế giới C++ (tức là, một giao diện C của mã C++ không bao giờ nên cho phép ngoại lệ lan truyền). Thậm chí không an toàn để cho phép ngoại lệ C++ truyền qua một lớp mã C giữa hai mô-đun C++ (ví dụ, khi hàm C++ gọi hàm C mà lần lượt gọi hàm C++).

Một trong những lý do là không có chuẩn C++ nên các mô-đun C++ chỉ tương thích nhị phân nếu được biên dịch bởi cùng một trình biên dịch (trong cùng một phiên bản). Vì vậy, mã trong bất kỳ ngôn ngữ khác không thể được thiết lập để xử lý ngoại lệ C++. Trong trường hợp này (thư viện C++, giao diện C, được gọi từ Java), bạn sẽ phải nắm bắt ngoại lệ C++, truyền thông tin thông qua giao diện C (ví dụ, bằng cách sử dụng mã trả về lỗi), kiểm tra nó trong Java và ném một ngoại lệ ở đó.