Unterstützt Android schwache Symbole?
Ich habe mir Fragen angesehen wie:
Cannot load library: reloc_library [1285]: 'rand' kann nicht gefunden werdenAndroid App stürzt beim Start ab, weil java.lang.UnsatisfiedLinkError Es scheint mir, dies könnte mit @ gelöst werdschwache Symbole. Das heißt, eine native Komponente könnte Symbole wie @ bereitstellerand
aber schmücke sie mit__attribute__((weak))
. Wenn das Symbol in einer anderen Bibliothek wie der Standardlaufzeit gefunden wird, würde das schwach verknüpfte Symbolnich verwendet werden. Wenn andererseits das Symbol fehlt, wird die Version der nativen Komponente verwendet.
Ich habe Probleme beim Auffinden von Informationen für Android (zu viele Nebengeräusche während der Suche).
Ich habe eines meiner Crypto ++ / JNI-Beispielprojekte geöffnet und Folgendes zu einer CPP-Datei hinzugefügt. DasAutoSeededRandomPool
ist nur ein Crypto ++ - Zufallszahlengenerator-Objekt (es gibt nichts Besonderes oder Schwieriges).
// CPP file
#ifdef __cplusplus
extern "C" {
#endif
int __attribute__((weak)) rand(void)
{
int r;
AutoSeededRandomPool& prng = GetPRNG();
prng.GenerateBlock(&r, sizeof(r));
return r;
}
#ifdef __cplusplus
}
#endif
er Versuch, es zu kompilieren, führt zuredefinition of int rand()
. Ich habe auch folgendes ausprobiert:
// CPP file
#ifdef __cplusplus
extern "C" {
#endif
int rand(void) __attribute__((weak));
int random(void)
{
...
}
#ifdef __cplusplus
}
#endif
Und bewegenint rand(void) __attribute__((weak));
zur H-Datei erzeugt das gleicheredefinition of int rand()
.
Und ich erhalte keine Fehler oder Warnungen zu einem unbekannten Attribut.
Ich sehe auch, dass__GXX_WEAK__
ist definiert als1
im Präprozessor, aberSUPPORTS_WEAK
istnich definiert, also seine gemischten Signale (vielleicht ein Fehler, ähnlich wieDefinieren GXX_WEAK bis 0 bei Verwendung von -fno-weak).
Ich bin mir nicht sicher, ob ich etwas falsch mache oder etwas wie @ erleconst und schwaches Attribut mit c ++ Code, oder etwas anderes
Unterstützt Android schwache Symbole? Wenn ja, wie benutzt man sie?
Hier eine ähnliche Stapelüberlauf-Frage, auf die es keine Antwort gibt:
Unterschiedliches Verhalten beim Überschreiben schwacher Funktionen in gemeinsam genutzten Bibliotheken zwischen OS X und AndroidEinige Systemdetails:
Base-System ist Mac OS X 10.8.5, vollständig gepatchtEclipse 4.4.1 (Luna), vollständig gepatchtAndroid NDK Revision 10dGCC 4.9 Cross-Compiler