2016-05-08 32 views
1

我正在嘗試將MP3讀寫功能添加到我的Android應用程序。我使用lame4android應用程序作爲起點。編碼一個文件適用於我,但我遇到了解碼功能的問題 - 我收到了對解碼功能的未定義引用。undefined lame解碼函數

下面是我摘錄wrapper.c:

#include "libmp3lame/lame.h" 
#include "jni.h" 

lame_t lame; 

jint Java_com_intonia_dandy_WavStream_initEncoder(JNIEnv *env, 
                jobject jobj, 
                jint in_num_channels, 
                jint in_samplerate) 
{ 
    lame = lame_init(); 
    ... 
    return lame_init_params(lame); 
} 

hip_t hip; 

jint Java_com_intonia_dandy_WavStream_initDecoder(JNIEnv *env, jobject jobj) 
{ 
    hip = hip_decode_init(); 
    return hip != 0; 
} 

而且這裏距離lame.h聲明:

lame_global_flags * CDECL lame_init(void); 

typedef hip_global_flags *hip_t; 
hip_t CDECL hip_decode_init(void); 

我收到一條錯誤消息:

C:/ACode/dandy/src/main/jni/./wrapper.c:62: undefined reference to `hip_decode_init` 

我也收到未定義的參考hip_decode和和hip_decode_exit。但是lame_initlame_init_params,lame_encode_bufferlame_encode_flush不會產生任何錯誤。我使用命令行運行ndk-build時會出現這些錯誤,而當我讓Android Studio管理編譯時,我會得到相同的錯誤。

lame_*功能與hip_decode_*功能有什麼不同?我應該使用已棄用的lame_decode_*嗎?

編輯:我正在看ndk-build命令的輸出。 .c文件在編譯時在控制檯上列出。 hip_decode_init定義在jni/libmp3lame/mpglib_interface.c中,但mpglib_interface未被編譯,即使它在jni/Android.mk中列出。爲什麼不???

回答

1

事實證明,作爲分佈式的LAME庫沒有啓用解碼。得到它的工作,我必須做到以下幾點:

  1. 添加#define HAVE_MPGLIB 1mpglib_interface.c

  2. 複製所有的.c和.h文件從LAME分佈mpglib目錄。

  3. 編輯Android.mk以包含mpglib中的.c文件。

編輯:不是修改mpglib_interface.c定義HAVE_MPGLIB, 最好是設置編譯標誌。

與Android工作室2+工作,應該的build.gradle含有

android { 
    defaultConfig { 
     ndk { 
      moduleName "libmp3lame" 
      cFlags "-DSTDC_HEADERS -DHAVE_MPGLIB" 
     } 
    } 
} 

或者在Android.mk:

LOCAL_CFLAGS = -DSTDC_HEADERS -DHAVE_MPGLIB