我正在尝试将 MP3 读写功能添加到我的 Android 应用程序中。我使用 lame4android 应用程序作为起点。对文件进行编码对我有用,但我在使用解码函数时遇到了问题——我得到了对解码函数的 undefined reference 。
以下是我的 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
的 undefined reference 。但是 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/中列出安卓.mk
。为什么不呢???
最佳答案
事实证明,分发的 LAME 库没有启用解码。为了让它工作,我必须执行以下操作:
将
#define HAVE_MPGLIB 1
添加到mpglib_interface.c
从 LAME 发行版的 mpglib 目录中复制所有 .c 和 .h 文件。
编辑 Android.mk 以包含来自 mpglib 的 .c 文件。
编辑:不是修改 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
关于android - 未定义的 lame 解码函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37102769/