android ndk UnsatisfiedLinkError, wenn über einen vordefinierten freigegebenen Bibliothek
Ich versuche zu schaffen, eine geteilte Bibliothek, links zu anderen freigegebenen Bibliothek.
Hier ist mein main-Modul Android.mk:
TOP_LOCAL_PATH := $(call my-dir)
include $(call all-subdir-makefiles)
LOCAL_PATH := $(TOP_LOCAL_PATH)
include $(CLEAR_VARS)
LOCAL_CPP_EXTENSION := cpp
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include/ $(LOCAL_PATH)/lib/include
LOCAL_MODULE := SightCore-jni
LOCAL_SRC_FILES := SightDemo.cpp SightCore-jni.cpp
LOCAL_SHARED_LIBRARIES := SightAPI
LOCAL_LDLIBS = -llog
include $(BUILD_SHARED_LIBRARY)
Ich habe auch das vorgefertigte shared library ./lib-Verzeichnis mit der eigenen Android.mk-Datei:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := SightAPI
LOCAL_SRC_FILES := libSightAPI.so
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
Den SightCore-jni.cpp Quell-Datei ist die jni-Schnittstelle zu der gemeinsam genutzten Bibliothek und geladen wird mit dem Befehl
System.loadLibrary("SightCore-jni");
Während des ndk-build-Prozess bekomme ich keine Zusammenstellung oder Verknüpfung Fehler.
Wenn ich versuche, führen Sie die Anwendung und Zugriff auf eine der nativen Methoden bekomme ich die UnsatsfiedLinkError.
Ich bemerkte, dass, wenn Sie deaktivieren Sie die Verweise auf die SightAPI in meinem jni-code und setzen Sie einen typo, der LOCAL_STATIC_LIBRARIES := SightAPI Linie, Der build ist erfolgreich und es ist kein UnsatisfiedLinkError.
Dies bedeutet, dass die jni-code, den ich habe, ist gut (ich bin eigentlich sicher, dass es ok ist...)
So die Beobachtung ist wie folgt:
Wenn ich zum Beispiel die "shared library" mit der vordefinierten geteilte Bibliothek, die ich bekommen beschädigt .so Datei.
Wenn ich kompilieren des gleichen ndk Projekt ohne Verknüpfung zu den vordefinierten shared-Bibliothek vorhanden ist kein problem laden der gemeinsam genutzten Bibliothek aus der java-Seite.
Bitte helfen Sie mir, wenn Sie können.
Vielen Dank im Voraus,
Ita
Wie kann ich mein link gemeinsam genutzte Bibliothek auf Android-NDK-Projekt Kann u bitte Erklären Sie mir,
InformationsquelleAutor Ita | 2011-03-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gefunden das Problem.
Offenbar das ndk-build-system nicht automatisch laden verwiesen shared libraries, auch wenn Sie deklariert sind, in Ihrem Android.mk.
Ich musste anrufen auf
System.loadLibrary(SightAPI) & System.loadLibrary("SightCore-jni")
um dieses Problem zu lösen. Ich hätte erwartet, dass die einzige Bibliothek zu laden gewesen wäre, die main library SightCore-jni.Gut..ich denke, die moral ist, Wenn Sie wollen etwas tun, tun Sie es selbst 🙂
+1 von Roy Samuel für seine Mühe und den richtigen Instinkt.
Ich hoffe, dies hilft jemand.
Cheers
InformationsquelleAutor Ita
Haben Sie sichergestellt, dass die cpp name der Funktion, die Sie verwenden möchten, über JNI, entsprechend zu den Paket-Namen der Java-wrapper-Klasse, wo
System.loadLibrary("SightCore-jni");
vorhanden ist?z.B. Wenn Sie möchten, verwenden Sie die C-Funktion
myFunction
in der java-Schicht, und nehme Ihre JNI-wrapper-Klasse ist in dem Paketcom.my.package.sightcore
,dann ist dein C-code-name der Funktion sollte wie folgt sein :
Wenn Sie Ihre app auf Ihrem Gerät
Sehen Sie, wenn Sie die API-levels, und damit auch die sdk-Version passt zu Ihrem Gerät, android-version (API-Ebene).
Hoffe, das hilft. Lassen Sie mich wissen, wenn Sie brauchen mehr Erklärungen...
was passiert, wenn wir haben ein .also die Datei war zunächst nicht dazu bestimmt, in JNI-Umgebung. Die Methode dieser Bibliothek wäre nicht der Namenskonvention erstellt javah-Befehl der Anwendung der package name und class name der Funktion. Wie würde das funktionieren? Danke
Soweit ich weiß, wenn die .also die Datei hat nicht die richtige Namenskonvention, ich.e, die JNI naming-Schema, Sie werden nicht "exportiert", um die java-Ebene. Daher kann nicht verwendet werden. Sie haben zu erhalten, der Quellcode zu dieser library, und erstellen Sie Sie mit der richtigen Namenskonvention, so dass es sichtbar für den Einsatz auf der Java-Ebene. Hoffe, das hilft.
Vielen Dank für die Erklärung!
Eine einfache Lösung, wenn Sie nicht bekommen kann die Quelle des ursprünglichen sein könnte zu schreiben, eine Bibliothek, das einwickeln der ursprünglichen Funktionen mit Namen, die mit der jni-Konvention.
InformationsquelleAutor Roy Samuel