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