使用Android NDK调用嵌套函数后挂起应用程序

时间:2012-07-16 19:03:41

标签: android android-ndk fftw

我构建Android项目,我使用Android NDK和LibXTract来提取音频功能。 LibXTract使用fftw3库。项目由按钮组成,该按钮运行简单的示例形式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 执行位于 jni的fftw3函数 fftwf_plan_r2r_1d /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");

应用程序挂起 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

我为fftw3和libxtract创建了config.h,并且gen.sh脚本在源文件夹中找到了成功。两个librearies都构建为静态并与共享库libcom_androidnative1_NativeClass.so

链接

命令

nm -Ca libcom_androidnative1_NativeClass.so 

显示包含使用的功能。

构建应用程序并将其部署到设备而没有任何问题。

我用标志 - disable-alloca - enable-float 构建fftw3,并使用标志 - enable-fft 构建LibXTract - 禁用依赖性跟踪

仅在库源代码中添加了dbgprint并删除了定义XTRACT_FFT形式的LibXtract beacouse它无法检测到fftw库。

如果有人对我的行为有任何疑问,请帮助。


这里我将整个项目放在github中,所以也许有人可以帮我处理这个问题。

https://github.com/bl0ndynek/AndroidNative1

2 个答案:

答案 0 :(得分:4)

感谢您解决FFTW3维护问题。 解决方案是在FFTW3中将优化级别从FFTW_MEASURE更改为FFTW_ESTIMATE(从1到0),
FFTW的计划器(在xtract_init_fft中)实际执行并计时不同的FFT算法,以便为给定的n选择最快的计划。但是,为了在尽可能短的时间内完成此操作,定时器必须具有非常高的分辨率,并且为了实现此目的,FFTW3采用大多数CPU上可用但不在Android默认ARM配置上的硬件循环计数器。 因此,这个算法使用gettimeofday(),它具有低分辨率,而ARM则永远使用xtract_init_fft。

答案 1 :(得分:0)

在我看来,你在递归函数X()中缺少一些终止条件,这会使你陷入无限循环。