Ich versuche, eine JNI-Funktion zu verwenden, um eine Java-Klasse zu erstellen und einige Eigenschaften dieser Klasse mit der DeviceId.java-Konstruktormethode festzulegen. Ich kann die Konstruktormethode mit GetMethodID abrufen, aber wie würde ich eine neue Instanz von Device.java erstellen und dann die Eigenschaften (setId und setCache) festlegen. Das Ziel besteht darin, eine vollständig befüllte Instanz von Device.java Object an den Aufrufer zurückzugeben. Irgendwelche Ideen?
JNI-Funktion:
%Vor%Java-Klasse:
%Vor% Wenn Sie GetMethodID
aufgerufen haben, haben Sie die Signatur für den Konstruktor mit zwei Argumenten angegeben. Daher müssen Sie nur Ihre jstring
und eine jbytearray
übergeben, wenn Sie NewObject
aufrufen - zum Beispiel:
Sie müssen die Methoden setId
und setCache
nicht aufrufen, es sei denn, Sie entscheiden sich für den 0-arg-Konstruktor - und das macht Ihren Code nur komplizierter, da Sie GetMethodID
für diese Aufrufe aufrufen müssen Sie. Einfacher, um die Route fortzusetzen, auf der Sie gerade sind.
Ich wollte ein benutzerdefiniertes Java-Objekt von JNI cpp code zurück nach Java zurückgeben. Die Lösung besteht darin, einen jobject
von der cpp-Funktion zurückzugeben und unser benutzerdefiniertes Java-Objekt in der nativen Methodendeklaration zu verwenden.
und Methodendeklaration in Java:
%Vor%auf der cpp-Seite:
%Vor%Bestimmen Sie die Signatur der Methode mit %Code%. Sehen Sie sich auch hier an.
Wenn ein Fehler ähnlich dem folgenden auftritt: javap -s java.your.package.YourClass
Die Methodensignatur ist falsch, Sie übergeben falsche Argumente an JNI ERROR (app bug): attempt to use stale Global 0xf2ac01ba
oder Sie verwenden keinen globalen Status von jni-Objekten - mehr hier .