Hacktoberfest 2026: những issue maintainer đã đánh dấu cho tháng Mười, đang mở và phù hợp người mới. Xem issue Hacktoberfest

JNA should include std::exception::what() in thrown `java.lang.Error`

Đang mở
#1,192 5 bình luận 0 reaction 0 người được giao Xem trên GitHub

Chưa có ai nhận issue này.

Đánh giá

Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức phù hợp với người mới
25/100
Loại issue
Lỗi
Độ rõ ràng
Khá rõ ràng
Mức độ hoạt động
Đình trệ
Công nghệ
cpp, java
Lĩnh vực
backend, tooling

Hướng nghiên cứu

Bắt đầu từ đường dẫn binding của Native.loadLibrary và theo dõi cách một std::exception native trở thành java.lang.Error. So sánh đường dẫn đó với workaround của InvocationMapper và GetLastError trong issue. Hoàn thành có nghĩa là lỗi được ném ra bao gồm std::exception::what() thay vì chỉ báo cáo truy cập bộ nhớ không hợp lệ, và hành vi đã được kiểm tra với ví dụ Windows.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

feature request

As a caller of a cpp hunk of math I want std::exceptions to be nicely translated by JNA across the bindings so that I can more easily debug runtime problems.

I have some cpp code that I've updated to throw std::exception's that contain valuable data in their what() clause. What I was hoping JNA would do is this:

//mylib.dll
#include <exception>

extern "C" __declspec(dllexport) 
const void MYCOMPANY_compute_eigen_values_or_something()
{
  throw std::exception("message from native code: kablamo!")
}
interface MyLib: Library {
  public void MYCOMPANY_compute_eigen_values_or_something()
}
var lib = Native.loadLibrary("mylib", MyLib.class, options)
try { lib.MYCOMPANY_compute_eigen_values_or_something() }
catch(Throwable ex){
  System.out.println(ex)
}

expected: java.lang.Error: In native code: message from native code: kablamo!
actual: java.lang.Error: Invalid memory access

... on: Windows 10 1903, JNA 4.2.2


My work around:
Wrap my code in a try { } catch { }, save it to a global variable, and expose a function GetLastError() that I then call from the handler. If you combine this with StackWalker you can even get a java--ish native code stack trace in your preconditions/postconditions. From the java side, I add my own InvocationMapper to catch JNA thrown java.lang.Errors, call GetLastError() then throw a new exception with the results.

Ngôn ngữ chính
Java
Star
8.9k
Fork
1.7k
Merge trung bình
1 ngày 13 giờ
Pull request đã merge (30 ngày)
1

Chuẩn bị môi trường

Dự án này không cung cấp dev container, Dockerfile hay hướng dẫn đóng góp, nên bạn cần tự thiết lập môi trường: hãy bắt đầu từ README và xem hướng dẫn đóng góp lần đầu của chúng tôi để biết các bước chung.

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của java-native-access/jna

Tất cả issue của java-native-access/jna

Issue tương tự

Thêm issue về Java

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.