Неопределенная функция 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, как распределенная, не имеет включенного декодирования. Чтобы это работало, мне нужно было сделать следующее:

  1. добавлять #define HAVE_MPGLIB 1 в mpglib_interface.c

  2. Скопируйте все файлы.c и.h из каталога mpglib дистрибутива LAME.

  3. Отредактируйте 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
Другие вопросы по тегам