22/12/2022
I en verden domineret af Java og Kotlin, når det kommer til Android-appudvikling, kan det virke overraskende at overveje brugen af C og C++. Disse ældre, men utroligt kraftfulde programmeringssprog, spiller dog en afgørende rolle under overfladen af mange populære Android-applikationer. De tilbyder en unik kombination af ydeevne, kontrol og kompatibilitet, som moderne sprog ofte ikke kan matche, især når det handler om ressourcekrævende opgaver. Denne artikel vil udforske, hvorfor og hvordan C/C++ anvendes i Android-udvikling, hvilke fordele det bringer, og hvilke udfordringer udviklere kan støde på.

Hvad er C/C++ i mobiludvikling?
C, der blev skabt i 1972 af Dennis Ritchie, er et procedurelt programmeringssprog, der oprindeligt blev designet til at skrive operativsystemer. Det er kendt for sin adgang til lavt niveau til hukommelsen og en ligetil syntaks, hvilket gør det ideelt til systemprogrammering. Mange efterfølgende sprog har lånt funktioner fra C, og det betragtes ofte som 'moderen' til alle sprog. C++ er en udvidelse af C, der tilføjer objektorienterede funktioner og yderligere abstraktioner, hvilket giver udviklere mere fleksibilitet og magt.
I mobiludvikling, og især for Android, bruges C/C++ til at skrive 'native' kode – kode der kompileres direkte til maskinlæsbare instruktioner for en specifik processorarkitektur. Dette står i modsætning til Java/Kotlin, som kompileres til en mellemliggende 'bytecode', der derefter udføres af en virtuel maskine (ART på Android). Forskellen ligger i den direkte interaktion med hardware, hvilket kan medføre markante forbedringer i effektivitet og hastighed.
Hvorfor vælge C/C++ til Android-apps?
Der er flere tvingende grunde til, at udviklere vælger at inkludere C/C++ kode i deres Android-projekter, selvom Java og Kotlin er de primære sprog for app-udvikling. Disse grunde centrerer sig ofte om at overvinde begrænsninger ved de højere niveau sprog eller udnytte eksisterende ressourcer.
Ydeevne og effektivitet
Den mest fremtrædende årsag er uden tvivl behovet for høj ydeevne. Applikationer, der kræver intense beregninger, såsom:
- Spil og grafikintensive apps: Rendering af komplekse 3D-miljøer, fysiksimuleringer og realtidsanimationer kræver tusindvis af beregninger på pixelniveau. C/C++ tillader direkte manipulation af grafik-API'er som OpenGL ES eller Vulkan, hvilket giver maksimal kontrol og hastighed.
- Billed- og videobehandling: Algoritmer til filtrering, komprimering eller analyse af billeder og videoer kan være meget beregningstunge. Native kode kan udføre disse operationer betydeligt hurtigere end Java/Kotlin.
- Kryptografi: Sikre og hurtige kryptografiske operationer er afgørende for mange apps. C/C++ kan implementere disse med minimalt overhead.
- Maskinlæring (ML): Store ML-frameworks som TensorFlow Lite og PyTorch Mobile er ofte bygget med C++-kerner. Dette skyldes behovet for at udføre lineære algebra-operationer og andre matematiske beregninger ekstremt hurtigt, ofte ved at udnytte GPU'er via teknologier som CUDA.
Ved at placere de mest ydelseskrævende dele af en app i native kode kan udviklere opnå en responsivitet og flydende brugeroplevelse, der ville være svær at opnå med kun Java eller Kotlin.
Krydsplatformskompatibilitet
En anden stor fordel er muligheden for krydsplatformskompatibilitet. Hvis du udvikler en app, der skal køre på både Android og iOS (eller endda desktop), kan du skrive den kerneforretningslogik, der kræver høj ydeevne, i C eller C++. Denne kode kan derefter genbruges på tværs af forskellige platforme med minimale ændringer. Dette reducerer udviklingstid og sikrer ensartet funktionalitet og ydeevne på tværs af økosystemer.
Adgang til lavt niveau og eksisterende kodebaser
C/C++ giver enestående adgang til hardware og systemressourcer på lavt niveau, hvilket er essentielt for opgaver som f.eks. direkte hukommelsesadgang, styring af enhedsperiferiudstyr (sensorer, kameraer) og integration med eksisterende systembiblioteker skrevet i C/C++. Mange ældre, veletablerede biblioteker og kodebaser inden for specifikke domæner (f.eks. lydbehandling, videokodecs, spilmotorer) er skrevet i C/C++. Ved at bruge NDK kan Android-udviklere nemt integrere disse eksisterende biblioteker i deres apps uden at skulle omskrive dem i Java eller Kotlin.
Sådan integreres C/C++ i Android-projekter
For at muliggøre brugen af C/C++ i Android-apps har Google udviklet Android Native Development Kit (NDK). NDK er et værktøjssæt, der gør det muligt at skrive dele af din app i native sprog som C og C++.
Android NDK og byggesystemer
Android NDK leverer de nødvendige kompilere, linkere og biblioteker til at bygge native kode til Androids forskellige processorarkitekturer. Når du tilføjer C/C++ kode til dit Android-projekt (typisk i en cpp/ mappe i dit modul), kompileres denne kode til et 'shared library' (delt bibliotek) – en fil med filendelsen .so (shared object). Gradle, Androids byggesystem, kan derefter pakke dette bibliotek med din app.

Til at styre kompileringen af den native kode understøtter Android Studio to primære byggesystemer:
- CMake: Et populært, krydsplatformsværktøj, der bruges til at administrere byggeprocessen for C/C++ projekter. Det er ofte det foretrukne valg for nye projekter og for dem, der arbejder med eksisterende C/C++ kodebaser. CMake bruger en
CMakeLists.txtfil til at definere, hvordan din native kode skal bygges. - ndk-build: Et ældre byggesystem, der er specifikt for Android NDK. Det er hurtigere for nogle projekter, men mindre fleksibelt end CMake for krydsplatformsprojekter. Det bruger en
Android.mkfil.
Det er vigtigt at bemærke, at du ikke kan bruge CMake og ndk-build i samme modul.
Java Native Interface (JNI): Broen mellem sprog
Den afgørende komponent, der gør det muligt for Java- eller Kotlin-kode at interagere med C/C++ kode (og omvendt), er JNI (Java Native Interface). JNI fungerer som en bro, der tillader funktioner defineret i native biblioteker at blive kaldt fra Java/Kotlin, og omvendt. Forestil dig, at du har en kompleks algoritme skrevet i C++, som du vil bruge i din Android-app. Du definerer en 'native' funktion i din Java/Kotlin-klasse, f.eks.:
public native String stringFromJNI();Denne funktion har ingen implementering i Java/Kotlin, men JNI vil søge efter en tilsvarende funktion i dine native .so biblioteker, når appen kører. For at appen kan finde og indlæse det native bibliotek, bruges System.loadLibrary("dit_biblioteksnavn"). JNI håndterer derefter de komplekse detaljer med at oversætte data mellem Java/Kotlin og C/C++ typer.
Delte biblioteker og ABI
Når din C/C++ kode kompileres, resulterer det i et eller flere delte biblioteker (.so filer). Disse biblioteker er platformsspecifikke. Android-enheder kører på forskellige processorarkitekturer, kendt som Application Binary Interfaces (ABI'er). De mest almindelige Android ABI'er inkluderer:
arm64-v8a(til 64-bit ARM-processorer, de fleste moderne telefoner)armeabi-v7a(til 32-bit ARM-processorer)x86ogx86_64(til Intel/AMD-processorer, ofte brugt i emulatorer og Chromebooks)
For at din app kan køre på en bred vifte af enheder, skal du typisk kompilere dine native biblioteker for hver af disse ABI'er. Android Studio og Gradle håndterer dette, og APK'en vil indeholde separate .so filer for hver understøttet arkitektur, placeret i lib/<ABI>/ mappen. Ved runtime indlæser Android den korrekte version til enhedens CPU.
Opsætning i Android Studio
Android Studio gør processen med at opsætte et C/C++-kompatibelt projekt relativt ligetil. Du kan enten starte et nyt 'Native C++' projekt eller tilføje native kode til et eksisterende projekt. Studio vil automatisk oprette den nødvendige cpp/ mappe og en CMakeLists.txt fil med et eksempel på C++ kode (f.eks. native-lib.cpp). Analysator for APK kan bruges til at verificere, at de native biblioteker er korrekt pakket i din app.
Fordele ved C/C++ i praksis
For at illustrere vigtigheden af C/C++ i den virkelige verden, lad os se på nogle konkrete anvendelsesområder og eksempler på populære applikationer, der udnytter disse sprog.
Grafik og rendering
Som nævnt tidligere er C/C++ uundværlig for avanceret grafik. Spilmotorer som Unity og Unreal Engine har deres kernekomponenter skrevet i C++, hvilket giver dem den rå kraft til at manipulere 3D-modeller, teksturer og belysning i realtid. Apps, der kræver CAD-lignende funktionalitet eller kompleks datavisualisering, vil også drage stor fordel af native kode.
Maskinlæring
Størstedelen af de populære maskinlæringsframeworks, herunder TensorFlow og PyTorch, er bygget med C++ i deres kerne. Selvom du interagerer med dem via Python eller Java/Kotlin-wrappers, udføres de tunge beregninger i C++. Dette skyldes behovet for at optimere lineær algebra og tensoroperationer, som er fundamentale for ML-algoritmer.
Systemsoftware og indlejrede systemer
C er stadig kongen inden for systemprogrammering. Kernen i operativsystemer som Linux (som Android er bygget oven på), Windows og UNIX er skrevet i C. Derudover bruges C i vid udstrækning til indlejrede systemer, lige fra mikrocontrollere i husholdningsapparater til komplekse systemer i biler og rumfart. Dette giver en robust og pålidelig base for mange Android-funktioner og -enhedsdrivere.
Populære apps, der bruger C/C++
Mange af de apps, vi bruger dagligt, indeholder betydelige mængder C/C++ kode for at opnå deres funktionalitet og ydeevne:
| Applikation/Virksomhed | Anvendelse af C/C++ |
|---|---|
| Adobe Systems (f.eks. Photoshop, Illustrator) | Kernekomponenter til billed- og grafikbehandling, UI-rendering. |
| Google-applikationer (f.eks. Google File System, Chromium, YouTube) | Kerneinfrastruktur, webbrowser-motorer, videobehandling og datahåndtering. |
| Mozilla (f.eks. Firefox, Thunderbird) | Browser- og e-mail-klientmotorer, netværksstakke. |
| Amazon | Kernekomponenter til forespørgselsbehandling og serverinfrastruktur. |
| Spilmotorer (f.eks. Unity, Unreal Engine) | Rendering, fysik, spil-logik, lavt-niveau optimering. |
Udfordringer ved C/C++ udvikling
Selvom fordelene ved C/C++ i Android-udvikling er mange, kommer det også med en række udfordringer, som udviklere skal være opmærksomme på.

Manuel hukommelsesstyring
I C/C++ er udvikleren ansvarlig for manuelt at allokere og frigøre hukommelse. Dette står i skarp kontrast til Java/Kotlin, hvor en 'garbage collector' automatisk håndterer hukommelsesstyring. Manuel hukommelsesstyring kan let føre til fejl som:
- Hukommelseslækager: Hukommelse, der allokeres, men aldrig frigives, hvilket gradvist kan opbruge systemressourcer og få appen til at crashe.
- Buffer overflows: Forsøg på at skrive data ud over de allokerede buffergrænser, hvilket kan føre til sikkerhedsbrister eller uforudsigelig adfærd.
Disse fejl kan være svære at debugge og kan kompromittere appens stabilitet og sikkerhed.
Stejl indlæringskurve og kompleksitet
C og C++ er sprog på lavt niveau, der kræver en dybere forståelse af computerarkitektur, hukommelsesmodeller og systemoperationer. Sammenlignet med Java og Kotlin, som er mere abstrakte og 'udviklervenlige', har C/C++ en stejlere indlæringskurve. Debugging af native kode kan også være mere kompleks og kræver specialiserede værktøjer som LLDB, der er integreret i Android Studio.
Begrænsede moderne sprogfunktioner
Især C mangler mange af de indbyggede sprogfunktioner, der er standard i moderne højere niveau sprog, såsom objektorienteret programmering (i C++ er det dog tilgængeligt), indbygget 'garbage collection' og robust undtagelseshåndtering. Dette kan gøre implementeringen af visse designmønstre mere besværlig og resultere i mere kompleks og mindre vedligeholdelsesvenlig kode, hvis ikke det håndteres omhyggeligt. Standardbiblioteket i C er også mere begrænset, hvilket ofte betyder, at udviklere skal skrive mere specialiseret kode for at opnå den ønskede funktionalitet.
Ofte Stillede Spørgsmål (FAQ)
Har Android-apps brug for et C-bibliotek?
Nej, Android-apps behøver ikke nødvendigvis et C-bibliotek for at fungere. Langt de fleste Android-apps er udelukkende udviklet i Java eller Kotlin. C/C++ er primært nødvendigt for specifikke scenarier, hvor der kræves ekstremt høj ydeevne, direkte hardwareadgang, eller hvor eksisterende native kodebaser skal genbruges. Hvis din app ikke har disse specifikke behov, er det ofte mere effektivt at holde sig til Java/Kotlin for at drage fordel af deres hurtige udvikling, sikkerhed og enklere hukommelsesstyring.
Kan C-kode køre på Android?
Ja, C-kode kan absolut køre på Android-enheder. Dette gøres muligt gennem Android Native Development Kit (NDK). NDK giver udviklere mulighed for at kompilere C- og C++-kildekode til native biblioteker (.so filer), som derefter kan pakkes ind i Android-applikationer (APK'er). Disse native biblioteker kan derefter interagere med Java- eller Kotlin-koden via Java Native Interface (JNI), hvilket giver adgang til lavt-niveau funktioner og ydeevneoptimeringer.
Er C en god platform for appudvikling?
C er en fremragende platform for appudvikling, men det afhænger af appens specifikke krav og kontekst. For apps, der kræver maksimal ydeevne (f.eks. spil, grafik, realtidsbehandling, maskinlæring) eller integration med eksisterende native kode, er C (og C++) et ideelt valg. Dets evne til at arbejde tæt på hardware og optimere ressourceforbrug er uovertruffen. Dog er det vigtigt at anerkende de udfordringer, der følger med, såsom manuel hukommelsesstyring og en mere kompleks udviklingsproces. For generel applikationsudvikling, hvor hastighed ikke er den absolut højeste prioritet, er højere niveau sprog som Kotlin eller Java ofte mere produktive og lettere at vedligeholde.
Konklusion og fremtiden for C i appudvikling
C og C++ fortsætter med at være uundværlige værktøjer i Android-appudviklerens arsenal, især for de applikationer, hvor ydeevne, kontrol på lavt niveau og genbrug af eksisterende kodebaser er afgørende. Selvom de kommer med udfordringer som manuel hukommelsesstyring og en stejlere indlæringskurve, opvejes disse af de fordele, de giver i form af hastighed og effektivitet.
Fremtiden for C/C++ i mobiludvikling ser lys ud, især med den fortsatte vækst inden for områder som Internet of Things (IoT), kunstig intelligens (AI) og augmented/virtual reality (AR/VR). Disse teknologier kræver ofte den form for lavt-niveau optimering og direkte hardwareinteraktion, som C/C++ er bedst til. Selvom Kotlin og Java vil forblive de primære sprog for størstedelen af Android-apps, vil C/C++ fortsat spille en kritisk rolle i at drive de mest krævende og innovative mobiloplevelser, der skubber grænserne for, hvad der er muligt på en smartphone.
Hvis du vil læse andre artikler, der ligner C/C++ i Android-appudvikling: En Dybdegående Guide, kan du besøge kategorien Mobiludvikling.
