JNI stürzt beim Aufruf von CallVoidMethod ab

8

Ich versuche eine Java-Methode von nativem C-Code in einer Android-Anwendung aufzurufen. Das klingt ziemlich einfach mit der Verwendung von JNI, aber mein Code stürzt immer ab, wenn ich schließlich die Methode selbst aufruft. Hier ist mein Code: Nativer C-Code:

%Vor%

Java-Code:

%Vor%

doSomething () wird nicht einmal erreicht, ich kann dort einen Breakpoint setzen, der nie getroffen wird. Und wie gesagt, sobald ich den CallVoidMethod-Aufruf auskommentiere, wird er nicht abstürzen, aber offensichtlich auch nicht showCar () aufrufen. Irgendwelche Hinweise?

    
Lennart 23.09.2011, 14:44
quelle

1 Antwort

11

4 Ideen für Sie:

...

jclass clazz = env- & gt; FindClass ("com / pfad / zu / der / klasse");

Können Sie bestätigen, dass der Name nicht "com / path / to / the / MyClass" lautet, wobei der Klassenname das erste Großbuchstabe ist und offensichtlich der Name "class" ein reserviertes Wort ist. Es gibt eine leichte Diskrepanz zwischen der Verwendung des JNI C-Symbolnamens "Java_com_path_to_my_package_renderStuff" und der FindClass () - Suche in "com / path / to / the / class" in Ihrem Beispiel. Aber da Ihr stackoverflow nicht über UnzufriedeneLinkageError ist, kann ich nur raten, dass Ihr Beispiel nicht mit sich selbst konsistent ist.

Bei meinem Beispiel würde ich erwarten, dass der JNI C-Symbolname "Java_com_path_to_the_MyClass_renderStuff" und der FindClass () -Lookup auf "com / path / to / the / MyClass" lautet. Die Verwendung des ersten Großbuchstabens der Klasse und des ersten Kleinbuchstabens des Methodennamens könnte für Verknüpfungszwecke wichtig sein.

...

Sind Sie sicher, dass der übergebene "jobj" vom selben Typ ist wie der "com / path / to / the / class", den Sie suchen? Vielleicht kannst du deinen nativen Code in deinen Java-Code einfügen:

%Vor%

Damit wird sichergestellt, dass Java-Code ohne einen JVM-Absturz verursacht. Sie müssten auch Ihren C-Symbolnamen anpassen, um "_1internal" an das Ende anzufügen, was "Java_com_path_to_the_MyClass_renderStuff_1internal" (das extra "1" -Zeichen ist vorgesehen)

...

Versuchen Sie vielleicht, zwischen jeder Aussage, zu der Sie eine Liste führen, eine Ausnahmeprüfung durchzuführen:

%Vor%

Dies wird Dinge wie Sicherheitsverletzungen aufnehmen, wenn Sie versuchen, Reflektionen zu machen, wenn dies nicht erlaubt ist.

...

%Vor%

Eine weitere Idee, den Aufruf FindClass () zu entfernen. Dies würde mit jeder Klasse funktionieren, an der GetMethodID gearbeitet hat, ähnlich wie dyamische Typisierung / späte Bindung.

    
Darryl Miles 25.09.2011, 22:03
quelle

Tags und Links