2016-08-28 1 views
0

Ich habe mit einem Projekt gearbeitet, das mit zwei gemeinsam genutzten Bibliotheken aus anderen Anwendungen verknüpft werden muss, ohne sie tatsächlich in das endgültige Paket aufzunehmen. Ich benutzte Android Studio mit einer üblichen Art, eine externe ndk-build auszuführen, aber ich benutze jetzt die experimentelle Gradle NDK-Unterstützung.Wie wird eine Verbindung zu einer gemeinsam genutzten Bibliothek hergestellt, ohne in das endgültige Paket aufgenommen zu werden?

Von dem, was ich von den Informationen here verstehe, wird die Verwendung der JniLibs-Quellsatz die Binärdatei mit der endgültigen Anwendung, die nicht was ich will. Ich möchte während der Kompilierungszeit eine Verbindung mit den Bibliotheken herstellen und erwarte, dass mein eigenes Modul in einer Umgebung geladen wird, in der sie verfügbar sind.

Meine alte Workaround war die Zeile hinzufügen: TARGET_NO_UNDEFINED_LDFLAGS := innerhalb der Android.mk, aber ich bin mir nicht bewusst, irgendeinen Weg zu etwas Entsprechendes mit der neuen NDK-Unterstützung.

Derzeit bin ich mit dem jni Verzeichnis, das die Bibliotheken neben meiner Quelle enthält von -L"<directory>"-ldFlags Hinzufügen und Verknüpfen gegen sie, wie ich sich mit einer Systembibliothek, wie weiter unten (zur Zeit, ich bin nur für ARMv7 Gebäude):

android.ndk { 
    moduleName = "ropecraftpe" 
    ldLibs.addAll(['log', 'name of one library', 'name of other library']) 
    ldFlags.add('-L"' + file('src/main/jni').absolutePath + '"') 

    cppFlags.add('-std=c++11') 
    stl = 'gnustl_shared' 
    abiFilters.addAll(['armeabi-v7a']) 
} 

das funktioniert in den meisten Fällen - seltsam genug, die Linke nicht über Anrufe zu statischen Funktionen oder Globals nicht beschweren, aber hat beschweren, wenn man versucht einen Konstruktor in einer der Bibliotheken definiert zu verwenden: Error:(12) undefined reference to 'ClassName::ClassName(std::string const&, etc.)'. Diese Klasse ist in einer Headerdatei definiert, die in meinem eigenen C++ - Code enthalten ist, und der Konstruktor ist definitiv in der verknüpften .so enthalten.

Wie wird dieses Projekt erfolgreich verknüpft?

Antwort

0

Ich habe einen Workaround gemacht; Meine Lösung bestand darin, die Bibliotheken, mit denen ich verlinken wollte, in das Systembibliotheksverzeichnis des NDKs aufzunehmen.

Diese befindet sich unter ANDROID_NDK/platforms/android-XX/arch-XX/usr/lib/. Dies scheint gut zu funktionieren, da ich wollte, dass die Bibliotheken auf die gleiche Weise wie Systembibliotheken behandelt werden (nicht als Prebuilt enthalten, aber immer noch verlinkt).

Als Ergänzung kann man die Header-Dateien unter dem Verzeichnis include dort platzieren.

Verwandte Themen