2012-01-07 4 views
8

Ho un semplice file stlTest2.cpp come questo:Corporatura problema quando si utilizza <cmath> con Android NDK

#include <jni.h> 

#include <cmath> 


bool isnan (void); 

C'è qualcosa di più complicato in qualche codice che sto porting. La mia domanda è questa. Perché dovrebbe funzionare quando si utilizza GCC al di fuori dell'NDK, ma non con l'NDK? Ci error che dà è questo:

jni/stlTest2.cpp:6: error: expected unqualified-id before 'sizeof' 
jni/stlTest2.cpp:6: error: expected ')' before 'sizeof' 

Il motivo immediato di questo è che math.h (incluso via <cmath>) definisce isnan come una macro. Perché la build al di fuori del ndk non include lo #define da math.h, ma questo è? Se commento l'include nel codice, tutto va bene, ma non è accettabile in quanto questo problema si ripete .... molto.

+0

Perché dichiarate 'isnan' con un tipo incompatibile? –

risposta

2

In $ NDK \ sources \ cxx-stl \ gnu-libstdC++ \ libs \ armeabi \ include \ bit \ C++ config.h (cambiamento armeabi a tutto ciò che è appropriato) cambiare questa:

/* #undef _GLIBCXX_USE_C99_MATH */ 

a

#define _GLIBCXX_USE_C99_MATH 1 

Quindi pulire e creare nuovamente il progetto.

4

La macro isnan è stata aggiunta in C99. In C++ 11 è stato aggiunto come una funzione nella std namespace, sovraccarico per float e double e long double (quindi una tipica <cmath> intestazione, come il tuo non NDK GCC è probabilmente utilizzando, potrebbe avere qualcosa di simile:

#undef isnan 

inline bool isnan(float ...) { ... } 

inline bool isnan(double ...) { ... } 

inline bool isnan(long double ...) { ... } 

), ma apparentemente NDK non ha ricevuto il memo e continua a fornire la macro C99 come comodità. (isnan non è mai stato una macro in C++, ma prima di TR1 aggiunto std::tr1::isnan, non c'era davvero una valida alternativa C++, in modo multiplo compilatori C++ fornito la macro C99.)

Avete bisogno di essere in grado di utilizzare il compilatore fornito isnan o std::isnan? Se no, allora si può solo cambiare questo:

#include <cmath> 

a questo:

#include <cmath> 

#undef isnan 

(e allo stesso modo per tutte le altre macro problematici, a condizione che non ne hanno bisogno).

+0

Posso farlo e ho iniziato a farlo, ma il codice è pieno di tale. Mi chiedevo se esistesse un modo per far sì che Android usasse un cmath diverso e più aggiornato. In caso contrario, accetterò la tua risposta. Ho già votato. Grazie. Btw stesso problema con molte macro di math.h, ma la stessa soluzione dovrebbe funzionare. – corbin

+0

Provare questo: http://www.crystax.net/en/android/ndk/7 – corbin

+0

Trovato il modo di risolvere questo problema. Vedi la mia risposta. – corbin

Problemi correlati