2012-07-16 30 views
2

我使用Android NDK與LibXTract來構建Android項目以提取音頻功能。 LibXTract使用fftw3庫。項目由按鈕女巫的運行簡單的示例形式libxtract:使用Android NDK調用嵌套函數後應用程序掛起

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"); 

應用fftwf_paln_r2r_1d沒有崩潰或任何outher錯誤我必須強制它停止工作。

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); 
} 

從我目錄下載可以看到:

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 

我genereate的config.h爲fftw3和libxtract與gen.sh腳本定位與成功的源文件夾。這兩個librearies是建立靜態和共享libary聯libcom_androidnative1_NativeClass.so

命令

nm -Ca libcom_androidnative1_NativeClass.so 

表明,使用功能的inclueded。

應用程序構建和部署到設備沒有任何問題。

我建立fftw3與標誌- 禁用ALLOCA--enable-浮動和LibXTract與標誌--enable-FFT- 禁用依賴跟蹤

只有在庫源代碼中添加了dbgprint,並刪除了定義XTRACT_FFT形式的LibXtract beacouse,它無法檢測到fftw庫。

如果有人對我這種奇怪行爲有任何想法,請幫忙。


在這裏我把整個項目放在github中,所以也許有人可以幫我處理這個問題。

https://github.com/bl0ndynek/AndroidNative1

回答

4

感謝FFTW3維護者問題解決。 解決方案是將FFTW_MEASURE中的優化級別從FFTW_ESTIMATE(從1到0)更改爲FFTW3,
FFTW的規劃器(在xtract_init_fft中)實際執行並計時不同的FFT算法,以便爲給定n選擇最快的規劃。然而,爲了在儘可能短的時間內完成此任務,定時器必須具有非常高的分辨率,爲了實現這一點,FFTW3採用了大多數CPU上可用的硬件循環計數器,但Android默認ARM配置中沒有。 所以這個算法使用gettimeofday()女巫具有低分辨率,並在ARM上在xtract_init_fft上永遠佔用。

+0

值得注意的是,LibXtract不再使用FFTW,而是Android上的Ooura,所以這應該不再是一個問題。 – 2014-08-06 09:19:40

0

它看起來像你對我缺少在您的遞歸函數X()一些終止條件這將讓你在一個無限循環。

+0

是的,但它沒有修改函數,當我在gcc下編譯它時,它工作正常。 – Jack 2012-07-16 19:30:59