android - 未定义的 lame 解码函数

标签 android android-ndk java-native-interface lame

我正在尝试将 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_decodehip_decode_exit 的 undefined reference 。但是 lame_initlame_init_paramslame_encode_bufferlame_encode_flush 不会产生任何错误。我在使用命令行运行 ndk-build 时遇到了这些错误,当我让 Android Studio 管理编译时我也遇到了同样的错误。

lame_* 函数与 hip_decode_* 函数有何不同?我应该使用已弃用的 lame_decode_* 吗?

编辑:我正在查看 ndk-build 命令的输出。 .c 文件在编译时列在控制台上。 hip_decode_initjni/libmp3lame/mpglib_interface.c 中定义,但是 mpglib_interface 没有被编译,即使它在 jni/中列出安卓.mk。为什么不呢???

最佳答案

事实证明,分发的 LAME 库没有启用解码。为了让它工作,我必须执行以下操作:

  1. #define HAVE_MPGLIB 1添加到mpglib_interface.c

  2. 从 LAME 发行版的 mpglib 目录中复制所有 .c 和 .h 文件。

  3. 编辑 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/

相关文章:

java - JNI 和旧的 C++ 代码

android - 从 .aar 文件 Android 中提取代码

android - 使用 Twilio JavaI420Buffer (Kotlin) 时出现 UnsatisfiedLinkError

android-ndk - 在 NDK 中使用 "exec()"

android - 添加共享lib.so到android项目

android - java.lang.UnsatisfiedLinkError 与 android 5.0 一起使用时

java - RxAndroid -BehaviorSubject 未在 onNext 上发出

Android CameraSource 对多种设备的工作方式不同并且不会旋转图像

java - setontouchlistener x 秒

java - 我可以将 java 窗口句柄传递给 OpenGL-es