Tipps für Middleware-Anbieter

Die Verteilung von Middleware, die mit dem NDK erstellt wurde, wirft einige zusätzliche Probleme auf, müssen sich App-Entwickler keine Gedanken machen. Vordefinierte Bibliotheken bei der Implementierung an ihre Nutzenden aus.

API-Levels und NDK-Versionen auswählen

Ihre Nutzer dürfen keine niedrigere minSdkVersion als Ihre verwenden. Wenn die Apps auf API 21 ausgeführt werden müssen, können Sie nicht für API 24 erstellen. Es ist in Ordnung, Ihre Bibliothek für ein niedrigeres API-Level als Ihre Nutzer zu erstellen. Sie können für API 16 entwickeln und gleichzeitig API 21-Nutzer unterstützen.

NDK-Versionen sind weitgehend kompatibel. Gelegentlich gibt es jedoch die die Kompatibilität beeinträchtigen. Wenn Sie wissen, dass alle Ihre Nutzer NDK-Version verwenden, ist es am besten, dieselbe Version zu verwenden, die sie auch verwenden. Verwenden Sie andernfalls die neueste Version.

STL verwenden

Wenn Sie C++ schreiben und die STL verwenden, wirkt sich Ihre Entscheidung zwischen libc++_shared und libc++_static auf Ihre Nutzer aus, wenn Sie eine freigegebene Bibliothek verteilen. Wenn Sie eine freigegebene Bibliothek verteilen, müssen Sie entweder libc++_shared verwenden oder dafür sorgen, dass die Symbole von libc++ nicht von Ihrer Bibliothek freigegeben werden. Am besten deklarieren Sie Ihre ABI-Oberfläche mit einem Versionsscript.

Eine weitere, weniger zuverlässige Option ist die Verwendung von -Wl,--exclude-libs,libc++_static.a -Wl,--exclude-libs,libc++abi.a für die Verknüpfung. Diese Methode ist weniger robust, da nur die Symbole in den Bibliotheken ausgeblendet werden, die explizit genannt werden. Für nicht verwendete Bibliotheken werden keine Diagnosen gemeldet. Ein Tippfehler im Namen der Bibliothek ist kein Fehler und es liegt in der Verantwortung des Nutzers, die Bibliotheksliste auf dem neuesten Stand zu halten. Dabei werden auch Ihre eigenen Implementierungsdetails nicht verborgen.

Native Bibliotheken in AARs verteilen

Das Android-Gradle-Plug-in kann native Abhängigkeiten importieren, die AAE: Wenn Ihre Nutzer das Android-Gradle-Plug-in verwenden, ist dies der die beste Möglichkeit, Ihre Bibliothek zu nutzen.

Native Bibliotheken lassen sich in automatisch angewendete Empfehlungen AGP Dies ist die einfachste Option, wenn Ihre Bibliothek bereits mit externalNativeBuild erstellt wurde.

Nicht-AGP-Builds können ndkports verwenden oder manuelles Packen durchführen, indem sie der Prefab-Dokumentation, um das Unterverzeichnis prefab/ des AAE zu erstellen.

Java-Middleware mit JNI-Bibliotheken

Java-Bibliotheken, die JNI-Bibliotheken enthalten (d. h. AARs, die jniLibs) müssen darauf achten, dass die darin enthaltenen JNI-Bibliotheken keine mit anderen Bibliotheken in der App kollidieren. Wenn im AAE beispielsweise libc++_shared.so, aber eine andere Version von libc++_shared.so als die App verwendet wird, wird nur eines im APK installiert. Dies kann zu unzuverlässigen verhalten.

Die zuverlässigste Lösung besteht darin, dass Java-Bibliotheken nicht mehr als eine JNI-Bibliothek enthalten. Dies gilt auch für Apps. Alle Abhängigkeiten, einschließlich der STL sollte statisch mit der Implementierungsbibliothek verknüpft sein und eine Version Script sollte verwendet werden, um die ABI-Oberfläche zu erzwingen. Für eine Java-Bibliothek com.example.foo, die die JNI-Bibliothek libfooimpl.so enthält, sollte beispielsweise das folgende Versionsscript verwendet werden:

LIBFOOIMPL {
global:
    JNI_OnLoad;
local:
    *;
};

In diesem Beispiel wird registerNatives über JNI_OnLoad verwendet, wie in den JNI-Tipps beschrieben. um sicherzustellen, dass die minimale ABI-Oberfläche sichtbar ist und die Bibliotheksladezeit werden minimiert.