Qualche esperienza con Android NDK?
-
18-09-2019 - |
Domanda
Sono particolarmente interessato a quanto sia portatile tra diversi telefoni.Abbiamo un'applicazione con del codice pesante di calcolo che vorremmo condividere tra Android e iPhone.Se potessimo scriverlo in C, avremmo un'unica base di codice, ma se l'NDK supporta solo un sottoinsieme dei processori creati dai produttori di telefoni, o se dobbiamo ricompilare per ciascun processore, non è una soluzione praticabile. .
Grazie per eventuali esperienze con esso.
Soluzione
A proposito di se tutti Android (versione 1.5 +) i telefoni supporteranno l'uscita della corrente NDK:
Tutto quello che posso dire è non c'è niente nella documentazione di suggerire altrimenti (se non forse se si legge un implicazione in " questo rilascio supporta il set di istruzioni ARMv5TE"), e seguo le notizie Android abbastanza da vicino e non hanno sentito parlare di eventuali telefoni Android di essere rilasciato utilizzando un'architettura non-ARM (anche se alcune persone messo insieme una build per EeePC ). Guardando il Android fonte , ci sono tracce di una sola altra piattaforma, x86. Per quanto riguarda i progetti futuri di Google e OHA ? Dovreste chiedere loro. Hanno recentemente annunciato alcune giorni sviluppatori , ma probabilmente tutti i punti sono andati oggi (il primo è oggi). Mi sono registrato abbastanza presto per il giorno di Londra (17 °), quindi se ricevo in cercherò di ottenere una risposta lì (io sono ansioso di sapere definitivamente troppo).
Altri suggerimenti
Io non sono molto familiare w / sviluppo Iphone, ma se si guarda sul Android NDK pagina , nella sezione strumenti di sviluppo, elenca le intestazioni garantiti disponibili nella piattaforma, per cui se l'iPhone supporta tali funzioni, oppure è possibile creare interfacce tra il codice e le librerie native su entrambe le piattaforme di non vedo il motivo per cui non avrebbe funzionato.
L'NDK è fondamentalmente un'implementazione del Interfaccia nativa Java per Android.Ti dà GCC 4.2.1 (il set completo di strumenti per quanto ne so) con target arm-eabi
.Non so se il codice risultante funzionerebbe su un iPhone o altri dispositivi;Non ho mai programmato per l'iPhone.Ecco cosa file
ha da dire su qualcosa che ho creato con l'NDK quindi forse puoi confrontare:
libpuzzles.so:Oggetto condiviso LSB a 32 bit ELF, ARM, versione 1 (SYSV), collegato dinamicamente, non rimosso
(strip
è incluso;Semplicemente non l'ho eseguito qui.) Ecco gcc -v
O g++ -v
(sono identici):
Utilizzo delle specifiche integrate.
Bersaglio:arm-eabi
Configurato con:/opt/digit/android/git/android-ndk/out/arm-eabi-4.2.1/toolchain/src/gcc-4.2.1/configure --prefix=/opt/digit/android/git/android-ndk /build/prebuilt/linux-x86/arm-eabi-4.2.1 --target=arm-eabi --host=x86
_
64-unknown-linux-gnu --build=x86_
64-unknown-linux-gnu --enable-linguals=c,c++ --disable-libssp --enable-threads --disable-nls --disable-libmudflap --disable-libgomp --disable-libstdc__-v3 -- disable-sjlj-Exceptions --disable-shared --with-float=soft --with-fpu=vfp --with-arch=armv5te --enable-target-optspace --with-abi=aapcs --disable-nls --prefix=/opt/digit/android/git/android-ndk/build/prebuilt/linux-x86/arm-eabi-4.2.1 --with-sysroot=/opt/digit/android/git/android-ndk /build/platforms/cupcake/arch-arm --program-transform-name=s,^,arm-eabi-,Modello di filettatura:separare
versione gcc 4.2.1
Supponendo che il codice venga eseguito, gestirlo a livello API è una questione separata e interessante.Android ti consentirà di chiamare solo codice nativo tramite l'API JNI.Non ho familiarità con l'approccio dell'iPhone, ma so che non è Java, quindi immagino che sia più simile al collegamento dinamico standard o dlopen()
?Ciò che intendo è che dovresti rendere le tue funzioni JNI (ad es. Java_com_example_Foo_YourMethod(JNI_Env*, jobject, ...)
affrontare l'essere chiamati da qualcosa che non è una JVM (ad esempio, il codice del tuo iPhone falsifica un JNI_Env?) o, in modo molto meno orribile, inizia fornendo un'API nativa adatta per iPhone e quindi includi un wrapper JNI, che non-JNI le piattaforme possono tranquillamente ignorare, il che, secondo me, è un approccio comune per questo genere di cose.Spero che aiuti.
Ho avuto una bella esperienza di scrittura cross-pane app JNI / C con l'elaborazione framebuffer in NDK e il rendering in JAVA.
Pitty, la sua una soluzione Android-only