我构建 Android 项目,其中使用 Android NDK库文件 https://github.com/jamiebullock/LibXtract来提取音频特征。 LibXTtract 使用fftw3 http://www.fftw.org/图书馆。项目由运行 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]);
}
Libxtract 函数xtract_init_fft位于jni/libxtract/jni/src/init.c执行fftw3函数fftwf_plan_r2r_1d位于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");
应用hang inside fftwf_paln_r2r_1d如果没有崩溃或任何其他错误,我必须强制它停止工作。
fftwf_paln_r2r_1d好像:
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);
}
从 CatLog 我可以看到:
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
我使用位于源文件夹中的 gen.sh 脚本成功为 fftw3 和 libxtract 生成 config.h。这两个库都是静态构建的,并与共享库 libcom_androidnative1_NativeClass.so 链接
Command
nm -Ca libcom_androidnative1_NativeClass.so
显示包含使用的功能。
应用程序已构建并部署到设备,没有任何问题。
我用标志构建 fftw3--禁用分配, --启用浮动和带有标志的 LibXTract--启用-fft and --禁用依赖项跟踪
仅在库源代码中添加了 dbgprint 并删除了 LibXtract 中定义 XTRACT_FFT 的内容,因为它无法检测 fftw 库。
如果有人对我这种奇怪的行为有任何想法,请帮忙。
在这里,我将整个项目放在 github 中,也许有人可以帮助我处理这个问题。
https://github.com/bl0ndynek/AndroidNative1 https://github.com/bl0ndynek/AndroidNative1