android - una - contestar llamadas con boton de volumen
Función colgar llamada después de llamada anidada con Android NDK (2)
Gracias por el problema del mantenedor FFTW3 está resuelto. La solución era cambiar el nivel de optimización de FFTW_MEASURE a FFTW_ESTIMATE (de 1 a 0) en FFTW3,
El planificador de FFTW (en xtract_init_fft) realmente ejecuta y mide el tiempo de diferentes algoritmos FFT posibles para elegir el plan más rápido para un n dado. Sin embargo, para hacer esto en el menor tiempo posible, el temporizador debe tener una resolución muy alta, y para lograrlo, FFTW3 emplea los contadores de ciclo de hardware que están disponibles en la mayoría de las CPU pero no en la configuración de ARM predeterminada de Android. Entonces, este algoritmo usa gettimeofday () que tiene baja resolución y en ARM tomó para siempre xtract_init_fft.
Construyo un proyecto de Android donde uso Android NDK con LibXTract para extraer las características de audio. LibXTract usa la biblioteca fftw3 . El proyecto consiste en un botón que ejecuta un ejemplo simple de libxtract:
JNIEXPORT void JNICALL Java_com_androidnative1_NativeClass_showText(JNIEnv *env, jclass clazz)
{
float mean = 0, vector[] = {.1, .2, .3, .4, -.5, -.4, -.3, -.2, -.1}, spectrum[10];
int n, N = 9;
float argf[4];
argf[0] = 8000.f;
argf[1] = XTRACT_MAGNITUDE_SPECTRUM;
argf[2] = 0.f;
argf[3] = 0.f;
xtract[XTRACT_MEAN]((void *)&vector, N, 0, (void *)&mean);
__android_log_print(ANDROID_LOG_DEBUG, "AndNat", "com_androidnative1_NativeClass.c before");
xtract_init_fft(N, XTRACT_SPECTRUM);
__android_log_print(ANDROID_LOG_DEBUG, "AndNat", "com_androidnative1_NativeClass.c after");
// Comment for test purpose
//xtract_init_bark(1, argf[1], 1);
//xtract[XTRACT_SPECTRUM]((void *)&vector, N, &argf[0], (void *)&spectrum[0]);
}
Función de libxtract xtract_init_fft localizar en jni / libxtract / jni / src / init.c ejecutar la función fftw3 fftwf_plan_r2r_1d ubicada en jni / fftw3 / jni / api / plan-r2r-1d.c
__android_log_print(ANDROID_LOG_DEBUG, "AndNat", "libxtract/src/init.c before");
fft_plans.spectrum_plan = fftwf_plan_r2r_1d(N, input, output, FFTW_R2HC, optimisation);
__android_log_print(ANDROID_LOG_DEBUG, "AndNat", "libxtract/src/init.c after");
Aplicación colgada dentro de fftwf_paln_r2r_1d sin bloqueo o cualquier otro error. Debo obligarlo a dejar de funcionar.
fftwf_paln_r2r_1d se ve así:
X(plan) X(plan_r2r_1d)(int n, R *in, R *out, X(r2r_kind) kind, unsigned flags)
{
__android_log_print(ANDROID_LOG_DEBUG, "AndNat", "fftw3/api/plan-r2r-1d.c");
return X(plan_r2r)(1, &n, in, out, &kind, flags);
}
De CatLog puedo ver:
07-16 18:50:09.615: D/AndNat(7313): com_androidnative1_NativeClass.c before
07-16 18:50:09.615: D/AndNat(7313): libxtract/src/init.c before
07-16 18:50:09.615: D/AndNat(7313): fftw3/api/plan-r2r-1d.c
Creo genereate config.h para fftw3 y libxtract con scripts gen.sh ubicados en la carpeta fuente con éxito. Ambas librerías están compiladas como estáticas y enlazadas con libary compartida libcom_androidnative1_NativeClass.so
Mando
nm -Ca libcom_androidnative1_NativeClass.so
muestra que las funciones usadas están incluidas.
Aplicación construir e implementar en el dispositivo sin ningún problema.
Construyo fftw3 con banderas --disable-alloca, --enable-float y LibXTract con banderas enable-FFT y la dependencia de seguimiento --disable
Solo se agregó la corrupción en el código fuente de la biblioteca dbgprint y se quita la definición de XTRACT_FFT de LibXtract porque no puede detectar la biblioteca fftw.
Si alguien tiene alguna idea sobre este comportamiento extraño para mí, por favor ayuda.
Aquí pongo todo el proyecto en github así que tal vez alguien me puede ayudar a manejar esto.
Me parece que te falta alguna condición de terminación en tu función recursiva X()
que te pondría en un bucle infinito.