android.toolchain.cmake "hello world" beispiel auf ein geraet bekommen

  • Hallo liebe Community,


    also ich bin neu hier, hab mich auch brav vorgestellt, und auf der Suche nach ein wenig Schuetzenhilfe die mir den Einstieg erleichtert.
    Im Zuge meines Studiums muss ich ein recht grosses Projekt, geschrieben in C++, nach Android portieren. Leider hat weder mein Prof. noch die Leute die das Projekt programmiert haben Erfahrung mit Android. Somit wende ich mich mal hier an euch und hoffe auf ein paar gute Inputs :)


    Soweit so gut. Im Speziellen habe ich 2 Probleme.


    Erstmal das Einfachere der Beiden. Wenn ich ein Geraet im AVD auswaehle mit einem armeabi-v7a ABI oder auch arm64-v8a. Startet der Emulator nicht.
    Ich bekomme folgende Errormeldung:


    emulator: Android emulator version 30.5.5.0 (build_id 7285888) (CL:N/A)
    emulator: WARNING: encryption is off
    Fontconfig warning: "/usr/share/fontconfig/conf.avail/05-reset-dirs-sample.conf", line 6: unknown element "reset-dirs"
    cannot add library /home/tjk/Android/Sdk/emulator/qemu/linux-x86_64/lib64/vulkan/libvulkan.so: failed
    added library /home/tjk/Android/Sdk/emulator/lib64/vulkan/libvulkan.so
    cannot add library /home/tjk/Android/Sdk/emulator/lib64/vulkan/libvulkan.so.1: full
    emulator: INFO: GrpcServices.cpp:301: Started GRPC server at 127.0.0.1:8556, security: Local
    fish: Job 1, './emulator -avd testDevice_API_…' terminated by signal SIGSEGV (Address boundary error)

    Bei x86_64 ABIs habe ich kein Problem. Da startet der Emulator ganz normal. Hier Tippe ich auf ein Problem mit Arch-Linux. Dass da irgendwie KVM evtl. ein Problem verursacht. Aber vielleicht ists ja auch ein anderes Problem.
    Im Moment ist das kein grosses Problem fuer mich aber im Zuge des Testens sollte das wohl auch hinhauen im Endeffekt.


    Das 2. Problem ist das Erstellen einer ausfuerhbaren Datei fuer ein Endgeraet.
    Ich nehme ein ganz einfaches hello world programm fuer den Anfang um den Prozess kennenzulernen und ein erstes Erfolgserlebnis zu haben.
    Gut, es rechnet 2 vorgegebene Zahlen zusammen anstatt Hello World auszugeben, also nicht ganz so einfach :)


    Aus diesem hello.cpp moechte ich eben eine ausfuehrbare Datei erstellen die ich dann am emulierte Geraet ausfuehren kann.


    Dazu habe ich 2 Dateien. Die hello.cpp sowie die CMakeLists.txt.
    In der CmakeLists.txt steht Folgendes:


    cmake_minimum_required(VERSION 3.6.0)
    project (hello)
    add_executable(hello hello.cpp)


    Alle notwendigen Tools sind natuerlich installiert. NDK, ADB usw.
    Ich arbeite ueber die Kommandozeile bisher. Soweit ich das aber mitbekommen habe koennte ich auch mit Gradle arbeiten. Waere das eurer Meinung nach zu bevorzugen? Ich glaube damit erspart man sich fuer jede ABI einen eigenen build zu machen, oder? Und klappt das dann ueber Android Studio?


    Ich habe jetzt jedenfalls folgenden Befehl in meine Shell eingegeben:


    cmake -DCMAKE_TOOLCHAIN_FILE=$NDK/build/cmake/android.toolchain.cmake -DANDROID_ABI="x86-64" -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_C_COMPILER=$CC -DCMAKE_CXX_COMPILER=$CXX


    Hier bekomme ich jedes mal die Info, dass die manuelle Anweisung zur ABI ignoriert wurde. Ich habe keine Ahnung warum. Ich denke, dass koennte aber erklaeren warum die Datei dann im Endeffekt am Geraet nicht ausfuehrbar ist. Kann das sein? Und wie setze ich die ABI korrekt? Sodass es nicht ignoriert wird von der android.toolchain.cmake Datei. Oder von CMake ich weiss nicht wer diesen Fehler jetzt ausspuckt.


    Die Builddateien werden aber jedenfalls ordentlich geschrieben. Und nachdem das erfolgreich beendet ist mache ich:


    cmake --build ./


    und es wird wunderbar meine ausfuerhbare Datei erstellt. Das hat mich erstmal gefreut weil ich dachte, dass alles gut funktioniert hat. Die Datei ist auch ausfuehrbar unter Arch-Linux und rechnet die beiden Zahlen zusammen. Eigentlich dachte ich, dass das nicht gehen wird sobald es durch die android.toolchain gelaufen ist. Liegt da schon der Hund begraben?


    So, dann also ueber die Kommandozeile mit dem Emulator ein x86-64 Geraet angesteuert. ABI 29 steht da dabei. Ich habe die ausfuehrbare Datei "hello" erstmal auf die sdcard gespielt.
    Ich habe gehoert, dass es eine gute Idee ist sie unter /data/local zu speichern. Da habe ich aber keine Rechte um etwas hinzukopieren.
    Deshalb also auf die sdcard und mit "su" root Rechte verliehen. Dadurch konnte ich die hello-Datei nach /data/tmp verschieben. Dachte mir, der Ordner wird auch gehen.
    Wenn ich dort nun versuche mit ./hello die Datei auszufuehren geht das nicht. Permission Denied. Kurz nachgesehen. Ich hab die Rechte nicht dazu. Also mit chmod +rwx alle Rechte vergeben.


    Ich habe die Rechte nun tatsaechlich und wenn ich die Datei ausfuehren will, erneut mit: ./hello erhalte ich die Fehlermeldung, dass die Datei nicht vorhanden ist. Obwohl sie ja da ist. Ich sehe sie und kann sie auch kopieren usw.


    Jetzt dachte ich mir, dass das Problem entweder ist, dass es eben fuer die falsche ABI gemacht wurde und deshalb nicht ausfuehrbar ist. Oder ich hab etwas falsch gemacht.
    In beiden Faellen waere ich euch dankbar wenn ihr mir weiterhelfen koenntet.


    Und nochmal die Frage: Waere es grundsaetzlich besser den ganzen Prozess mit gradle zu machen? Jetzt koennte ich noch gut umsteigen.


    Schonmal vielen Dank auch wenn das fuer den Anfang recht viele Fragen sind. :)


    Schoenen Abend und lg
    Thomas

  • Tja, also ich hab das doch noch loesen koennen. Das Problem war offensichtlich in meinem cmake Kommando. -DCMAKE_TOOLCHAIN_FILE=$NDK/build/cmake/android.toolchain.cmake die Variable $NDK war anscheinend falsch gesetzt. Ich habe nun den absoluten Pfad angegeben und dann wurde endlich die ABI anerkannt. Ganz verstaendlich ist es mir zwar nicht, denn wenn die Datei ja gefunden wird verstehe ich nicht warum das mit der ABI nicht geklappt hat. Aber seis drum. Ich hatte dann noch eine Schrecksekunde weil ich ja "X86_64 ausgewaehlt habe und das dann trotzdem nicht ging aber ich bin draufgekommen, dass mein emuliertes Gerae nur "X86" ist. Nach nochmaligem Build hat es jetzt geklappt 4 und 8 ist 12...und das gibt mir mein Programm nun auch zurueck am Android Geraet :)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!