Hacktoberfest 2026: die Issues, die Maintainer für den Oktober markiert haben – offen und einsteigerfreundlich. Hacktoberfest-Issues durchsuchen

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

Offen
#1,192 5 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Bewertung

Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Anfängerfreundlichkeit
25/100
Issue-Typ
Bug
Klarheit
Größtenteils klar
Aktivitätsstatus
Veraltet
Tech-Stack
cpp, java
Bereich
backend, tooling

Rechercherichtung

Beginne beim Binding-Pfad von Native.loadLibrary und verfolge, wie aus einer nativen std::exception ein java.lang.Error wird. Vergleiche diesen Pfad mit dem InvocationMapper- und GetLastError-Workaround des Issues. Als abgeschlossen gilt die Arbeit, wenn der ausgelöste Fehler std::exception::what() enthält, statt nur einen ungültigen Speicherzugriff zu melden, und das Verhalten anhand des Windows-Beispiels überprüft wurde.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

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.

Vorherrschende Sprache
Java
Sterne
8.9k
Forks
1.7k
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Entwicklungsumgebung

Dieses Projekt bietet weder Dev-Container noch Dockerfile noch Beitragsleitfaden – die Einrichtung liegt bei Ihnen. Beginnen Sie mit der README; die allgemeinen Schritte stehen in unserem Leitfaden für den ersten Beitrag.

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus java-native-access/jna

Alle Issues in java-native-access/jna

Ähnliche Issues

Weitere Issues zu Java

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.