Ich entwickle eine Anwendung, die mit einem Hardwaregerät interagiert. Unter Verwendung der DLL-Datei, die mit der offiziellen Anwendung der Hardware geliefert wird, initialisiere ich das Gerät und registriere eine Funktion als einen Rückruf, der bei einer Benutzerinteraktion aufgerufen wird. In dieser Callback-Funktion möchte ich eine Java-Funktion aufrufen, um Daten zu übertragen. Allerdings tritt die gesamte Anwendung ohne Fehlerprotokoll nur an diesem Anruf im Callback:JNI-Aufruf schlägt im Treiber-Callback fehl
jclass cls = env->FindClass("java/lang/String");
Der gleiche Anruf funktioniert, wenn es in der Funktion ausgeführt wird, die direkt von Java aufgerufen wird. Was ist der Grund für dieses Verhalten? Wie macht es den Unterschied, JNI von Gerätetreiberanrufen aus anzurufen? Jede Hilfe wird geschätzt.
EDIT: Ich versuchte Vernees Vorschlag und versuchte, den Treiber-Thread an JVM anzuhängen, jedoch änderte sich das Verhalten nicht. Außerdem habe ich die printf
Ausgänge verloren, die - leider - meine einzige Option zum Debuggen der JNI-Seite sind. Sie arbeiten vor dem Attach-Vorgang, hören aber auf, danach zu arbeiten.
Werfen Sie einen Blick hier: https://StackOverflow.com/a/12900986/3699139 Die 'JNIEnv *' ist nur gültig für den Thread, der den Aufruf zu nativen macht. –
@JornVernee hast du andere Vorschläge? – ram
Entschuldigung, das war meine einzige Vermutung. –