undefined lame decode function

痴心易碎 提交于 2019-12-13 01:44:58

问题


I'm trying to add MP3 read and write capabilities to my Android app. I'm using the lame4android app as a starting point. Encoding a file works for me, but I'm having a problem with the decode functions -- I'm getting undefined references to the decode functions.

Here are excerpts from my 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;
}

And here are the declarations from lame.h:

lame_global_flags * CDECL lame_init(void);

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

I'm getting an error message:

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

I'm also getting undefined references to hip_decode and and hip_decode_exit. But lame_init, lame_init_params, lame_encode_buffer, and lame_encode_flush do not generate any errors. I get these errors using the command line to run ndk-build, and I get the same errors when I let Android Studio manage the compilation.

How are the lame_* functions different from the hip_decode_* functions? Should I be using the deprecated lame_decode_*?

EDIT: I'm looking at the output of the ndk-build command. The .c files are listed on the console as they are compiled. hip_decode_init is defined in jni/libmp3lame/mpglib_interface.c, but mpglib_interface is not getting compiled, even though it's listed in jni/Android.mk. Why not???


回答1:


It turns out that the LAME library as distributed does not have decoding enabled. To get it working, I had to do the following:

  1. Add #define HAVE_MPGLIB 1 to mpglib_interface.c

  2. Copy all .c and .h files from the mpglib directory of the LAME distribution.

  3. Edit Android.mk to include the .c files from mpglib.

EDIT: instead of modifying mpglib_interface.c to define HAVE_MPGLIB, it's better to set compilation flags.

Working with Android Studio 2+, build.gradle should contain

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

Or in Android.mk:

LOCAL_CFLAGS = -DSTDC_HEADERS -DHAVE_MPGLIB


来源:https://stackoverflow.com/questions/37102769/undefined-lame-decode-function

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!