Verwenden Sie JNI zum Erstellen, Füllen und Zurückgeben einer Java-Klasseninstanz

9

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%     
c12 12.04.2012, 19:56
quelle

2 Antworten

7

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:

%Vor%

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.

    
Edward Thomson 12.04.2012, 20:05
quelle
0

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.

%Vor%

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 .

    
quelle

Tags und Links