Ich versuche, das NDK mit C ++ zu verwenden, und es scheint, dass die Namenskonvention für Methoden nicht korrekt ist. Meine native Methode lautet wie folgt:
extern "C" {
JNIEXPORT void JNICALL Java_com_test_jnitest_SurfaceRenderer_drawFromJni
(JNIEnv* env, jclass c)
{
//
}
}
mit einem Header in extern "C" {} aslo.
Alles lässt sich gut kompilieren, erstellt eine .so-Datei und kopiert sie in den libs-Ordner unter meinem Projekt. Wenn ich jedoch in Eclipse debugge und ausführe, erhalte ich immer wieder die Meldung "Keine Implementierung für native gefunden ...". Fehlt mir etwas, da alle NDK-Beispiele in C sind?
Vielen Dank.
android
android-ndk
Patrick Kafka
quelle
quelle
javah
? Wenn nicht, sollten Sie sein. :-PSystem.loadLibrary
Antworten:
Es gibt einige Dinge, die dazu führen können, dass "keine Implementierung gefunden wird". Einer hat den falschen Namen des Funktionsprototyps, ein anderer kann die .so überhaupt nicht laden. Sind Sie sicher, dass
System.loadLibrary()
dies aufgerufen wird, bevor die Methode verwendet wird?Wenn Sie keine
JNI_OnLoad
Funktion definiert haben, möchten Sie möglicherweise eine erstellen und eine Protokollnachricht ausspucken lassen, um zu überprüfen, ob die Bibliothek erfolgreich abgerufen wird.Sie sind bereits dem häufigsten Problem ausgewichen - Sie haben vergessen, es zu verwenden
extern "C"
-, also ist es entweder das oben genannte oder ein leichter Rechtschreibfehler. Wie sieht die Java-Deklaration aus?quelle
Eine zusätzliche Ursache für diesen Fehler: Ihr nicht dekorierter nativer Methodenname darf keinen Unterstrich enthalten!
Zum Beispiel wollte ich eine C-Funktion mit dem Namen exportieren
AudioCapture_Ping()
. Hier ist meine Exporterklärung in C:Hier war meine Java-Klasse, die die Funktion importierte:
Ich konnte Android nicht dazu bringen, dynamisch auf meine native Methode zu verlinken, bis ich den Unterstrich entfernt hatte:
quelle
Ich hatte das gleiche Problem, aber für mich war der Fehler in der Datei Android.mk. Ich hatte es:
sollte aber folgendes haben:
Beachten Sie stattdessen das Detail + = : =
Ich hoffe das hilft.
quelle
Externes "C" aufgerufen, wie im automatisch generierten Studio-Beispiel angegeben, aber vergessen, den gesamten Rest der Datei, einschließlich der folgenden Funktionen, in {} Klammern zu setzen. Nur die erste Funktion funktionierte.
quelle
Ein weiterer Grund: Verwenden Sie LOCAL_WHOLE_STATIC_LIBRARIES anstelle von LOCAL_STATIC_LIBRARIES in android.mk. Dies verhindert, dass die Bibliothek nicht verwendete API-Aufrufe optimiert, da das NDK die Verwendung der nativen Bindungen aus Java-Code nicht erkennen kann.
quelle
Unter Apps in ndk gibt es ein CPP-Beispiel: https://github.com/android/ndk-samples/blob/master/hello-gl2/app/src/main/cpp/gl_code.cpp
quelle
Verwenden Sie Javah (Teil des Java SDK). Es ist das Werkzeug genau dafür (generiert einen .h-Header aus einer .class-Datei).
quelle
Wenn Ihr Paketname _ Zeichen enthält, sollten Sie 1 (eins) nach _ Zeichen schreiben, wie unten gezeigt:
MainActivity.java
native-lib.cpp
quelle
Ich versuche alle oben genannten Lösungen, aber niemand kann meinen Erstellungsfehler beheben (jni java.lang.UnsatisfiedLinkError: Keine Implementierung gefunden für ...). Endlich habe ich festgestellt, dass ich vergessen habe, meine verify.cpp-Quelldatei zu CMakeList.txt hinzuzufügen add_library segement (verify.cpp wird automatisch durch Strg + Eingabetaste, möglicherweise einen anderen Dateinamen generiert), hoffe, meine Antwort kann jemandem helfen.
meine Build-Umgebung: Gradle + CMake
quelle
Ich hatte das gleiche Problem und in meinem Fall war der Grund, dass ich den Paketnamen "RFID_Test" unterstrichen hatte. Ich habe das Paket umbenannt und es hat funktioniert. Vielen Dank user1222021
quelle
Ich hatte zweimal das gleiche Problem. Es kam vor, dass das Telefon, auf dem ich versucht habe, die App von Android Studio aus zu starten, eine API-Ebene verwendete , die ich in Android Studio noch nicht heruntergeladen habe.
quelle