2013-06-10 13 views
5

Ich baue eine gemeinsam genutzte Bibliothek für die Verwendung in einer Java-App mit dem Android NDK. Unter Verwendung von readelf zur Überprüfung der Datei lib/armeabi-v7a/libXXXlib.so, die von einem Release-Build generiert wurde, scheint es alle Symbole (Funktion, Variablennamen) meines nativen C/C++ - Codes zu enthalten.Ist es möglich, Symbole aus einer gemeinsam genutzten Bibliothek mit Android NDK zu entfernen?

In der Tat scheint die gemeinsame Objektdatei identisch für die Debug-und Release-Builds zu sein. (Der einzige Unterschied in der Ausgabe im Ordner libs ist, ob die gsb.setup und gdbserver Dateien erstellt werden oder nicht.) Ich überschreibe die Optimierung von der NDK mit einer APP_CFLAGS += -O3 in meinem Application.mk, aber ich würde nicht erwarten, die Release-Build Debug-Symbole zu generieren, indem Sie das Flag -g, was es tut.

fand ich einen Kommentar über SO '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"' besagt, und eine andere Angabe: 'JNI cannot find the functions for java if they don't have names.'

ndk-build sicherlich etwas aus der obj/armeabi-v7a/libXXXlib.so Datei Strippen, wie viel größer ist als der, der schließlich in libs erstellt, aber es immer noch scheint die Namen aller Funktionen und Variablen in der Datei zu belassen.

Sind alle die Namen meiner Funktionen von JNI (anstatt nur die Einstiegspunkte in den nativen Code) benötigt?

Wenn nicht, wie kann ich die Symbole entfernen, die nicht benötigt werden?

Antwort

6

Fühlen Sie sich frei Standardsichtbarkeit einstellen = verborgen, und legen Sie Attribut Sichtbarkeit = Standard für die wenigen Funktionen, die Sie benötigen (ähnlich dllexport) in Windows

+3

auch exportieren, wenn Sie explizite Registrierung von JNI Methoden verwenden, Sie don Ich brauche sie nicht einmal, um sichtbar zu sein. Siehe http://developer.android.com/training/articles/perf-jni.html#native_libraries. – fadden

+2

Danke @ alex-cohn, @fadden. Ich habe "-visibility = hidden" zu meinem 'LOCAL_CFLAGS' in meinem' Android.mk' hinzugefügt und es entfernte alle Symbole * apart * von den JNI-Einstiegspunkten, die ich exportiere. (Daher habe ich keine explizite Registrierung von JNI-Methoden in JNI_OnLoad eingerichtet.) Wissen Sie, was die Sichtbarkeit dieser Funktionen festlegt? – Rich

+0

Weißt du auch, warum dies nicht für Release-Builds von ndk-build standardmäßig festgelegt ist? – Rich

Verwandte Themen