Mit Qt / C ++ Java-Code über JNI aufrufen. FindClass findet keine Klasse

8

Ich bin neu bei JNI und dies ist mein erstes Programm, das versucht, Java-Code von C ++ aufzurufen. Ich benutze Qt 5.2 und ich schreibe eine Android-Anwendung.

Ich kann meine Java-Klasse nicht finden und in mein C ++ - Programm laden. Ich habe eine Menge Posts hier auf Stack Overflow und anderen Orten gelesen und es scheint ein häufiges Problem zu sein, aber ich konnte noch nicht meinen lösen ..

Ich bin mir auch nicht sicher, ob die Java-VM richtig eingerichtet ist, da die Qt-Dokumentation in der QAndroidJniEnvironment minimal ist.

Ich suche nach einer Lösung, wie ich meine Java-Klasse finden kann. Ich freue mich auch über allgemeine Rückmeldungen zu anderen Abschnitten des Codes (ich gehe davon aus, dass es mehr Fehler geben könnte).

Fehler msg:

%Vor%

Java-Klasse:

%Vor%

.pro-Datei:

%Vor%

main.cpp:

%Vor%

jnimathcppwrapper.h:

%Vor%

jnimathcppwrapper.cpp:

%Vor%

Projektstruktur:

BEARBEITEN:

Ich habe auch einen anderen Ansatz versucht, der zu demselben Fehler führte:

%Vor%

Wenn Sie stattdessen versuchen, java / lang / String zu laden, finden beide oben genannten Methoden die Klasse.

BEARBEITEN:

Fehlerprotokoll:

%Vor%

Kommentar: Warum ist diese Frage kein Duplikat (von Alex Cohn)

Es besteht kein Zweifel, dass das Grundproblem hier dasselbe ist wie in FindClass aus jedem Thread in Android JNI , aber die hier gestellte Frage ist eine ganz andere Frage, IMO. Der Autor suchte nicht nach einer generischen Methode, um von nativen Threads auf den ClassLoader zuzugreifen. Er (oder sie) suchte nach einer einfachen und effizienten Möglichkeit, auf einen Java-Callback von Qt-basiertem Code zuzugreifen. Daher sind alle Diskussionen darüber, wie der Klassenlader in Android funktioniert und wie dies gepatcht werden kann, für ihn irrelevant. Wenn der Autor anders denkt, werde ich gerne zustimmen, diese Frage als Duplikat zu schließen

Update: Diese Frage bezieht sich nicht einmal auf JNI-Threads

Bitte beachten Sie den vorherigen Kommentar void. Diese Frage hat nichts mit Multithreading zu tun. Es geht darum, eine Android Qt-Anwendung so einzurichten, dass sie benutzerdefinierte Java-Klassen verwenden kann, ähnlich wie bei der Beispiel .

    
Phat 31.12.2013, 03:39
quelle

4 Antworten

1

Ich habe dieses Beispiel verwendet Ссылка

So habe ich es gemacht. In meiner Java-Hauptklasse habe ich eine statische Methode hinzugefügt, um dieselbe Aktivität aufzurufen (weil sie statisch sein muss):

%Vor%

Dann habe ich in meiner Header-Datei folgendes hinzugefügt:

%Vor%

und in meiner cpp-Datei habe ich gerade meine Java-Methode wie folgt aufgerufen:

%Vor%     
Dany19 13.08.2014 20:41
quelle
0

Wird Ihr Java-Quellverzeichnis in das android-build-Verzeichnis kopiert? Der Android-Ordner in Ihrem Quellordner muss in der qmake-Variable ANDROID_PACKAGE_SOURCE_DIR aufgeführt sein: Ссылка

    
cstream 16.01.2014 23:28
quelle
0

Der einfachste Weg, um FindClass zum Laufen zu bringen, besteht darin, es innerhalb der JNI_OnLoad-Funktion aufzurufen. Diese Funktion wird von JNI automatisch beim Laden im richtigen Thread aufgerufen. Die alte Version des Beispiels notificationclient hat diese Methode vor dem Commit # 6500083 verwendet. Dies ist eine Zusammenfassung des relevanten Teils der Datei androidjnibindings.cpp:

%Vor%

Dies ist nicht im 5.2-Beispielcode, da dies nicht mehr benötigt wird, um Java aus dem C ++ - Code aufzurufen, aber mir ist kein QT5.2-Beispiel bekannt, das den Aufruf von C aus Java zeigt.

    
sj0h 31.01.2014 04:43
quelle
0
  

jniMathClassID = qjniEnv- & gt; FindClass ("android / src / org / app / test / JniMath");

Anstelle von "android / src / org / app / test / JniMath" versuchen Sie, den Paketnamen: "org / app / test / JniMath" anzugeben und fügen Sie ihn in

ein %Vor%

So etwas ...

    
user3493496 03.04.2014 11:24
quelle

Tags und Links