Неопределенная функция lame decode
Я пытаюсь добавить возможности чтения и записи MP3 в мое приложение для Android. Я использую приложение lame4android в качестве отправной точки. Кодирование файла работает для меня, но у меня проблема с функциями декодирования - я получаю неопределенные ссылки на функции декодирования.
Вот выдержки из моего 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_init
, lame_init_params
, lame_encode_buffer
, а также lame_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, как распределенная, не имеет включенного декодирования. Чтобы это работало, мне нужно было сделать следующее:
добавлять
#define HAVE_MPGLIB 1
вmpglib_interface.c
Скопируйте все файлы.c и.h из каталога mpglib дистрибутива LAME.
Отредактируйте Android.mk, чтобы включить.c файлы из mpglib.
РЕДАКТИРОВАТЬ: вместо изменения mpglib_interface.c для определения HAVE_MPGLIB
лучше установить флаги компиляции.
Работая с Android Studio 2+, build.gradle должен содержать
android {
defaultConfig {
ndk {
moduleName "libmp3lame"
cFlags "-DSTDC_HEADERS -DHAVE_MPGLIB"
}
}
}
Или в Android.mk:
LOCAL_CFLAGS = -DSTDC_HEADERS -DHAVE_MPGLIB