2013-06-10 8 views
5

Sto costruendo una libreria condivisa per l'utilizzo in un'app Java utilizzando l'NDK di Android. Utilizzando readelf per ispezionare il file lib/armeabi-v7a/libXXXlib.so generato da una build di rilascio, sembra che contenga tutti i simboli (funzione, nomi di variabili) del mio codice C/C++ nativo.È possibile rimuovere i simboli da una libreria condivisa costruita con NDK Android?

Infatti, il file oggetto condiviso sembra identico per le build di debug e release. (L'unica differenza nell'output nella cartella libs è se vengono creati o meno i file gsb.setup e gdbserver. Sto ignorando l'ottimizzazione impostata da NDK con un APP_CFLAGS += -O3 nel mio Application.mk, ma non mi aspetto che la versione di rilascio per generare i simboli di debug includendo il flag -g, che esegue.

ho trovato un commento su SO affermando 'In both cases, debug and release, it leaves the -g flag in because, to quote the comment, "we generate symbol versions of the binaries that are later stripped when they are copied to the final project's libs/ directory"', e un altro affermando: 'JNI cannot find the functions for java if they don't have names.'

ndk-build è certamente strippaggio qualcosa dal file obj/armeabi-v7a/libXXXlib.so, in quanto è molto più grande di quella eventualmente creato nel libs, ma ancora sembra che tutti i nomi delle mie funzioni e delle variabili siano intatti nel file.

Sono tutti i nomi delle mie funzioni richieste da JNI (anziché solo i punti di ingresso nel codice nativo)?

In caso contrario, come posso rimuovere i simboli che non sono necessari?

risposta

6

Sentitevi liberi di impostare la visibilità di default = nascosto, e impostare la visibilità attributo = default per le poche funzioni necessarie per l'esportazione (simile a dllexport) in Windows

+3

Inoltre, se si utilizza la registrazione esplicita dei metodi JNI, don 'anche bisogno di quelli per essere visibile. Vedi http://developer.android.com/training/articles/perf-jni.html#native_libraries. – fadden

+2

Grazie @ alex-cohn, @fadden. Ho aggiunto '-fvisibility = hidden' al mio' LOCAL_CFLAGS' nel mio 'Android.mk' e ho rimosso tutti i simboli * a parte * dai punti di ingresso JNI che sto esportando. (Quindi non ho impostato la registrazione esplicita dei metodi JNI in JNI_OnLoad.) Sai cosa sta impostando la visibilità su quelle funzioni? – Rich

+0

Inoltre, sai perché questo non è impostato di default per le build di rilascio di ndk-build? – Rich