5

所以我试图在我的原生代码上使用 libopus 来运行一个 Android 应用程序。我的 Android.mk 文件如下所示:

PLATFORM_PREFIX := /opt/android-ext/
LOCAL_PATH := $(PLATFORM_PREFIX)/lib

include $(CLEAR_VARS)

LOCAL_MODULE := libopus
LOCAL_SRC_FILES := libopus.a

include $(PREBUILT_STATIC_LIBRARY)

# I have to redeclare LOCAL_PATH because the library is in /opt/android-ext/
# and my project is somewhere else. Not very elegant.

LOCAL_PATH := /home/sergio/workspace/Project/jni

include $(CLEAR_VARS)

LOCAL_MODULE := opusUtilsNative
LOCAL_SRC_FILES := opusUtilsNative.c
LOCAL_C_INCLUDES += $(PLATFORM_PREFIX)/include
LOCAL_STATIC_LIBRARIES := android_native_app_glue libopus

include $(BUILD_SHARED_LIBRARY)

我在 opusUtilsNative.c 中的代码如下所示:

#include "opusUtilsNative.h"
#include <opus/opus.h>
#include <opus/opus_types.h>

JNIEXPORT jbyteArray JNICALL Java_Project_OpusUtils_encode
  (JNIEnv * je, jclass jc, jbyteArray data){

    int rc;
    opus_int16 * testOutBuffer;
    unsigned char* opusBuffer;

    OpusDecoder *dec;

    dec = opus_decoder_create(48000, 2, &rc);
    return data;
}

当我尝试构建它时,它只有在我删除使用“opus_decoder_create”函数的行时才能正常工作。否则我会得到这个:

error: undefined reference to 'opus_decoder_create'

我可以看到 opus_decoder_create 在 opus.h 上明确定义,显然包含在内,因为如果我排除该行,我将收到有关 opus_int16 和 OpusDecoder 声明的错误。为什么有些定义被包括在内而有些没有?

任何帮助将不胜感激。

4

3 回答 3

5

这很棘手。经过一番挖掘,我意识到我没有正确交叉编译 opus 库,而且我根本没有 ARM 二进制文件。

验证您的库是否正确交叉编译的好方法:

cd /opt/android-ext/lib #Or wherever the .a file is
ar x libopus.a
file tables_LTP.o #Or any of the .o files generated by ar x

输出应如下所示:

tables_LTP.o: ELF 32-bit LSB relocatable, ARM, version 1 (SYSV), not stripped

否则,您可能需要仔细检查您的交叉编译过程。

于 2013-01-21T21:57:17.643 回答
0

这是链接器的错误,而不是编译器的错误。您忘记在Android.mk文件中添加对对应库的引用,请像这样:

LOCAL_LDLIBS += -lopus
于 2013-01-15T17:40:54.230 回答
0

我忘了集成一个密钥库

LOCAL_LDLIBS := -lGLESv2

这解决了我的问题。

于 2013-10-16T16:33:54.490 回答