2015-02-09 12 views
6

entfernt Ich benutze __system_property_get() von sys/system_properties.h, um eine Systemeigenschaft zu erhalten. Ich versuche r10c ndk zu benutzen, weil ich arm64 toolchain brauche.API, um Android-Systemeigenschaften zu erhalten, wird in arm64 Plattformen

__system_property_get() ist in libc.so definiert. Unten ist die Ausgabe von libc.so für armv5/armv7a.

readelf -Ws libc.so | grep property_get 

     194: 00009100 20 FUNC GLOBAL DEFAULT 4 __system_property_get 
     198: 00009100 20 FUNC GLOBAL DEFAULT 4 __system_property_get 

Aber sieht aus wie es für arm64 Version entfernt wurde! Ich erhalte einen Linker-Fehler, der besagt, dass er nicht definiert ist. Ich habe alle geteilten Bibliotheken von arm64 analysiert, aber keine von ihnen hat dieses Symbol.

Gibt es eine alternative API zum Abrufen der Systemeigenschaft im systemeigenen Code?

Vielen Dank!

Antwort

2

Dies sollte nie eine öffentliche API sein. Es ist in den 64-Bit-Toolchains versteckt, weil wir dies tun können, ohne die ABI-Kompatibilität zu brechen.

Gibt es eine alternative API, um die Systemeigenschaft in den systemeigenen Code zu bekommen?

Nein. Diese Funktion sollte nie mit Apps in Verbindung gebracht werden.

Was versuchen Sie zu tun?

+0

Wenn es keine öffentliche API sein sollte (aber die Implementierung für ABI-Kompatibilität beibehalten), sollte es auch aus den NDK-Headern entfernt werden (zumindest für die 64-Bit-Version der Header). Ich habe darüber auch einen Fragen-/Fehlerbericht unter http://b.android.com/143627 eingereicht. – mstorsjo

+0

Ja, der Header, der immer noch da ist, ist ein Fehler. Danke für den Bericht. –

+0

Ja. Die API ist immer noch in der Kopfzeile vorhanden, weshalb ich nach den Symbolen in allen Bibliotheken im NDK suchte. Ich erhalte die Seriennummer, das Modell usw. des Geräts unter Verwendung der Systemeigenschaften in meiner nativen Bibliothek. Gibt es einen anderen Weg, dies zu erreichen? – kanak

6

Es ist nützlich API für native Anwendungen, wie es für Java-Anwendungen ist, es stammt von der nativen Seite (siehe http://rxwen.blogspot.com/2010/01/android-property-system.html), und andere Android-System-Code verwendet es, so dass es unwahrscheinlich ist, bald wegzugehen.

#include <android/log.h> 
#include <dlfcn.h> 

#if (__ANDROID_API__ >= 21) 
// Android 'L' makes __system_property_get a non-global symbol. 
// Here we provide a stub which loads the symbol from libc via dlsym. 
typedef int (*PFN_SYSTEM_PROP_GET)(const char *, char *); 
int __system_property_get(const char* name, char* value) 
{ 
    static PFN_SYSTEM_PROP_GET __real_system_property_get = NULL; 
    if (!__real_system_property_get) { 
     // libc.so should already be open, get a handle to it. 
     void *handle = dlopen("libc.so", RTLD_NOLOAD); 
     if (!handle) { 
      __android_log_print(ANDROID_LOG_ERROR, "foobar", "Cannot dlopen libc.so: %s.\n", dlerror()); 
     } else { 
      __real_system_property_get = (PFN_SYSTEM_PROP_GET)dlsym(handle, "__system_property_get"); 
     } 
     if (!__real_system_property_get) { 
      __android_log_print(ANDROID_LOG_ERROR, "foobar", "Cannot resolve __system_property_get(): %s.\n", dlerror()); 
     } 
    } 
    return (*__real_system_property_get)(name, value); 
} 
#endif // __ANDROID_API__ >= 21 
+1

Downvoting ohne Erklärung ... ausgereift. – bleater

+0

Danke, Bleater - nützlicher Code. Ich musste RTLD_LAZY anstelle von RTLD_NOLOAD in meiner speziellen Kombination von NDK-Headern verwenden und es funktioniert gut. – kshepherd

+2

Ab NDK r11 scheint es als globales Symbol zurück zu sein. – bleater

-1

als Behelfslösung Bestätigung Antwort des @ bleater für die unbelichteten __system_properties_ * Symbole: dlopen libc und dlsym nach Bedarf.