webentwicklung-frage-antwort-db.com.de

Importieren Sie vorhandene C++ - Bibliothek (.a- oder .so-Datei). Ndk android

Ich bin gerade durch native Entwicklung in Android gegangen. Ich bin erfolgreich dabei, mein AndroidStudio 2.2.2 für das native Debelopment vorzubereiten

Ich baue auch Beispiel Hallo-Jni Projekt

Was ich versuche zu erreichen

Ich versuche, eine vorhandene Bibliothek zu verwenden, die in C++ entworfen wurde (statische Bibliothek .a extension oder .so -Datei).

Wenige Verwirrungen hinsichtlich der Entwicklung von Einheimischen

1) Soll ich die .cpp & .h-Dateien der vorhandenen C++ - Bibliothek anstelle von .a oder .so verwenden?

2) Muss ich CMakeLists.text machen: Soweit ich meine .a -Dateien gegoogelt habe nicht mit ndk-build generiert wird, muss ich sie erstellen.

Wenn ich .cpp & .h-Dateien verwende, sollte ich Android.mk & Application.mk

Kompiliert CMakeLists.text mein neu entwickeltes Android-Projekt als Bibliothek oder meine vorhandene .a -Datei?

3) Wo füge ich die Datei .a in meinem Projekt ein? Ist es unter jni Ordner?

4) Sollten meine Java-Klassendateien Methoden mit Schlüsselwort native definieren, wie sie in der C++ - Datei implementiert sind (Beispiel: In C++ - Datei Methodenname getData (), sollte die Java-Klasse öffentliche native getData () enthalten)

10
karthik kolanji

Ok, also hast du eine Menge Fragen. Einige dieser Fragen sind persönliche Vorlieben, aber ich werde sie als meine persönliche Wahl angeben. 

1

Das ist Deine Entscheidung. Ich persönlich würde die kompilierte .so-Datei verwenden. Auf diese Weise muss ich mich nie um NDK-, CMake- und .mk-Dateien kümmern. Wenn Sie die Datei haben, müssen Sie die Datei nur zum Ordner libs (nicht zum Ordner lib) hinzufügen und Ihre build.gradle-Datei geringfügig ändern. Das ist es.

Ändern Sie in build.gradle:

sourceSets {
    main {
        manifest.srcFile 'AndroidManifest.xml'
        Java.srcDirs = ['src']
        res.srcDirs = ['res']
        assets.srcDirs = ['assets']
        jniLibs.srcDirs = ['libs']
    }
}

2 & 3

Diese wären bei dieser Option irrelevant.

4

Sie müssten so etwas tun, egal ob Sie die Dateien oder die kompilierten Bibliotheken verwenden:

@SuppressWarnings("JniMissingFunction")
public class MyNativeMethods {
    static {
        System.loadLibrary("my_native_lib");
    }

    public native int native_method_1(int fd);
    public native int native_method_2(int fd);
    public native void native_method_3(int fd, int arr[]);
    public native int[] native_method_4(int fd);
}

Und dann können Sie diese Methoden von Ihrem ActivityFragment aufrufen.

Hoffe das ist klar genug.

_/EDIT (basierend auf Kommentar unten):

1) .so- oder .a-Dateien sind Ihre nativen Bibliotheken. 

2) Die Dateien .cpp, .c usw. sind nur Ihre nativen Quellcodedateien. Wenn Sie diese Dateien im Projekt verwenden möchten, müssen Sie ein Build-System (z. B. CMake) verwenden, um sie verwenden zu können. CMake würde Ihre Quellcodedateien verwenden und eine .so-Bibliothek erstellen, die wiederum die native Bibliothek ist. Aus diesem Grund habe ich vorgeschlagen, die .so-Dateien zu verwenden. Warum erledigen Sie die Implementierung von CMake in Ihrem Projekt, wenn Sie es nicht brauchen?

Wenn Sie CMake ausprobieren oder in Zukunft lernen möchten, überprüfen Sie diese Antwort: C/C++ mit Android Studio Version 2.2

3) System.loadLibrary("my_native_lib");: Hier weisen Sie die Java-Laufzeitumgebung an, diese gegebene Bibliothek hinzuzufügen. Auf diese Weise erstellen Sie eine Verknüpfung zwischen Java und dem C++ - Code, der sich in der Bibliothek befindet. Die Methoden unter dieser Zeile sollten denselben Namen haben wie im C++/C-Code. Auf diese Weise sucht und öffnet die Java-Laufzeitumgebung die Bibliothek und sucht nach dieser Methode in der von Ihnen geladenen Bibliothek. Mehr hier

Ab hier

Öffnen von gemeinsam genutzten Bibliotheken direkt von einem APK aus

In API-Ebene 23 und höher ist es möglich, eine .so-Datei direkt von Ihrem APK aus zu öffnen. Verwenden Sie einfach die System.loadLibrary ("foo") wie gewohnt, setzen Sie jedoch Android: extractNativeLibs = "false" in Ihrer AndroidManifest.xml. In älteren Versionen wurden die .so-Dateien zum Zeitpunkt der Installation aus der APK-Datei extrahiert. Dies bedeutete, dass sie Platz in Ihrem APK und erneut in Ihrem Installationsverzeichnis beanspruchten (und dies wurde für Sie gezählt und dem Benutzer als von Ihrer App belegter Speicherplatz gemeldet). Jede .so-Datei, die Sie direkt von Ihrem APK laden möchten, muss in der Zip-Datei (an einer 4096-Byte-Grenze) seitlich ausgerichtet und unkomprimiert gespeichert sein. Aktuelle Versionen des Tools zipalign sorgen für die Ausrichtung.

Beachten Sie, dass dlopen (3) ab API-Ebene 23 eine Bibliothek aus einer beliebigen ZIP-Datei öffnet, nicht nur aus Ihrem APK. Geben Sie einfach dlopen (3) einen Pfad der Form "my_Zip_file.Zip! /Libs/libstuff.so" ein. Wie bei APKs muss die Bibliothek seitenorientiert sein und unkomprimiert gespeichert werden, damit dies funktioniert.

1
not2qubit
0
CLIFFORD P Y