(NDK-Kompilierung) Detaillierte Erläuterung des mit Android.mk kompilierten C/C++-Programmprozesses

Wenn Sie ausführbare C/C++-Programmdateien auf Android-Geräten ausführen möchten , können Sie beispielsweise die NDK-Kompilierung verwenden , die oft besser geeignet ist als die GCC-Kompilierung . Hier verwende ich das von mir selbst geschriebene imx6q-Entwicklungsboard mit geladenem Android6.0.1 . Mirror, kompiliert mit NDK auf einem Ubuntu 64-Bit- System.

Inhaltsverzeichnis

1. Bereiten Sie Dokumente vor

2.Schreiben Sie Android.mk

Beachten

Vollständiger Android.mk-Code

3.NDK-Kompilierung

4. Führen Sie die ausführbare Datei aus


1. Bereiten Sie Dokumente vor

Legen Sie zunächst in einem neu erstellten Ordner zwei von Ihnen geschriebene Dateien ab, eine davon ist ein C-Sprachprogramm und die andere ist Android.mk. Der Inhalt des C-Sprachprogramms kann von Ihnen selbst bestimmt werden, solange es den Standards entspricht. Es kann auch die einfachste Art sein, „Hallo Welt“ zu drucken

2.Schreiben Sie Android.mk

Um Android.mk-Dateien zu schreiben, müssen Sie zunächst einige der erforderlichen Einstellungen verstehen. Hier werde ich zuerst meine Android.mk veröffentlichen. 

Der Inhalt der Datei ist sehr kurz. Lassen Sie uns ihn im Detail erklären.

LOCAL_PATH := $(call my-dir)

Zunächst muss die Variable LOCAL_PATH definiert werden, um Quelldateien im Entwicklungsbaum zu finden. Die Makrofunktion my-dir wird vom Kompilierungssystem bereitgestellt und verwendet, um den aktuellen Pfad (dh das Verzeichnis mit der Android.mk-Datei) zurückzugeben.

include $(CLEAR_VARS)

Dies ist eine notwendige Anweisung. CLEAR_VARS wird vom Kompilierungssystem bereitgestellt und zum Löschen vieler LOCAL_XXX-Variablen verwendet, wie zum Beispiel: LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES ...

LOCAL_MODULE := test_app

Im kompilierten Zielobjekt muss die Variable LOCAL_MODULE definiert werden, um jedes in der Datei Android.mk beschriebene Modul zu identifizieren. Der Name muss eindeutig sein und darf keine Leerzeichen enthalten. Das Kompilierungssystem generiert automatisch die entsprechenden Präfixe und Suffixe. Ein gemeinsam genutztes Bibliotheksmodul mit dem Namen „sum“ generiert die Datei „libsum.so“.

LOCAL_SRC_FILES := test_app.c

Die Variable LOCAL_SRC_FILES muss die C- oder C++-Quellcodedateien enthalten, die kompiliert und in das Modul gepackt werden. Wir müssen die Header-Dateien und Include-Dateien hier nicht auflisten, da das Kompilierungssystem automatisch die abhängigen Dateien für Sie findet. Listen Sie einfach die direkt an den Compiler übergebenen Quellcodedateien auf.

include $(BUILD_SHARED_LIBRARY)

BUILD_SHARED_LIBRARY bedeutet das Kompilieren und Generieren einer gemeinsam genutzten Bibliothek. Es handelt sich um eine vom Kompilierungssystem bereitgestellte Variable, die auf ein GNU-Makefile-Skript verweist. Sie ist für das Sammeln aller in den LOCAL_XXX-Variablen seit dem letzten Aufruf von „include $(CLEAR_VARS)“ definierten Informationen verantwortlich. ', und entscheiden, was kompiliert werden soll und wie. Machen Sie es richtig

Beachten

Sie können sehen, dass meine Android.mk-Datei zwei Zeilen enthält

LOCAL_CFLAGS += -pie -fPIE 
LOCAL_LDFLAGS += -pie -fPIE

Als ich diese beiden Codezeilen zunächst nicht hinzufügte, konnte ich NDK verwenden, um die ausführbare Datei erfolgreich zu kompilieren. Als sie jedoch auf der Entwicklungsplatine des Android-Systems platziert wurde, konnte sie nicht ausgeführt werden und es wurde ein Fehler gemeldet: Nur unabhängige ausführbare Dateien positionieren (PIE) werden unterstützt

Ich habe von diesem Problem und der Lösung erfahren, indem ich auf den Fehler verwiesen habe: Es werden nur positionunabhängige ausführbare Dateien (PIE) unterstützt. Grundsätzlich wurde der PIE- Sicherheitsmechanismus  ab Android 4.1 eingeführt. Die Lösung besteht darin, die beiden oben genannten Anweisungen in die Datei Android.mk einzufügen . Einfach zuschlagen

Vollständiger Android.mk-Code

Angesichts des vollständigen Android.mk-Codes müssen Sie test_app im folgenden Code durch den Namen der C-Programmdatei auf Ihrem Computer ersetzen, da meine C-Datei test_app.c heißt , wenn Sie sie direkt verwenden möchten.

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)


LOCAL_SRC_FILES := test_app.c
LOCAL_MODULE := test_app

LOCAL_CFLAGS += -pie -fPIE 
LOCAL_LDFLAGS += -pie -fPIE

include $(BUILD_EXECUTABLE)

#APP_ALLOW_MISSING_DEPS=true

#APP_PLATFORM        := android-14
APP_ABI             := armeabi-v7a x86 x86_64 arm64-v8a

3.NDK-Kompilierung

Öffnen Sie nach Abschluss der obigen Schritte das Terminal im aktuellen Ordner und geben Sie zum Kompilieren den Befehl ndk-build ein .

/home/yinlong/Music/sdkapp/android-ndk-r14b-linux-x86_64/android-ndk-r14b/ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=Android.mk

Nach erfolgreicher Kompilierung erscheinen zwei neue Ordner im aktuellen Verzeichnis und die generierten ausführbaren Programme werden im libs- Verzeichnis abgelegt.

 Sie können mehrere Versionen im libs- Verzeichnis sehen. Die für mein imx6q-Entwicklungsboard geeignete Version istdas Programm unter armeabi-v7a.

Nach dem Öffnen können Sie die kompilierte test_app sehen

4. Führen Sie die ausführbare Datei aus

Legen Sie die obige Datei auf dem Android-Gerät ab, das heißt, legen Sie sie in mein Entwicklungsboard ein und führen Sie den folgenden Befehl aus, um die Lese- und Schreibberechtigungen der Datei festzulegen. Beachten Sie, dass Sie über Root- Berechtigungen verfügen müssen.

chmod 777 test_app

Anschließend können Sie die von NDK kompilierte ausführbare Datei ausführen 

./test_app

Supongo que te gusta

Origin blog.csdn.net/danielxinhj/article/details/133073755
Recomendado
Clasificación