包含适当标头时对opus函数的未定义引用

时间:2014-02-11 13:28:17

标签: android android-ndk

为了减少应用程序的带宽使用,我试图实现opus。

首先,我将源代码交叉编译为共享库。我将生成的.so文件复制到我的jni文件夹中的opus文件夹中。我还将所有opus头文件复制到opus文件夹中的include子文件夹中。最后,我创建了一个Android.mk文件,允许在我的实现中使用这个.so文件。

所以我的文件结构如下:

/jni
  /opus
    /include
      All opus header files
    Android.mk
    libopus.so
  Android.mk
  OpusEncoder.h
  OpusDecoder.h
  OpusEncoder.c
  OpusDecoder.c

opus子文件夹中的Android.mk文件包含以下内容:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := opus
LOCAL_SRC_FILES := jni/opus/libopus.so
LOCAL_C_INCLUDES := jni/opus/include

include $(PREBUILD_SHARED_LIBRARY)

建议公开.so文件以供使用。

现在,在我的编码器/解码器实现中,我导入opus.h,并使用适当的函数将它们通过JNI暴露给Java层。

我的jni文件夹中的Android.mk(应该构建我的JNI层)如下:

LOCAL_PATH := $(call my-dir)
MY_DIR := $(LOCAL_PATH)
include $(CLEAR_VARS)

include jni/opus/Android.mk

APP_ABI := armeabi armeabi-v7a

LOCAL_PATH := $(MY_DIR)

LIB_PATH := $(LOCAL_PATH)/../lib
LOCAL_LDLIBS += -llog -landroid
#LOCAL_LDLIBS += $(LIB_PATH) -lopus
LOCAL_SHARED_LIBRARIES := opus

LOCAL_MODULE := OpusCodec

LOCAL_SRC_FILES := OpusEncoder.c \
                   OpusDecoder.c

include $(BUILD_SHARED_LIBRARY)

但是,当我运行ndk-build命令时,我收到以下6条错误消息:

error: undefined reference to 'opus_encoder_create'
error: undefined reference to 'opus_encode'
error: undefined reference to 'opus_encoder_destroy'
error: undefined reference to 'opus_decoder_create'
error: undefined reference to 'opus_decode'
error: undefined reference to 'opus_decoder_destroy'

opus.hlibopus.so公开了所有方法。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

好的,所以这一切都证明是我的印刷错误。 对于敏锐的观察者来说,为了制作预建的opus库,我使用了调用include $(PREBUILD_SHARED_LIBRARY),它应该是include $(PREBUILT_SHARED_LIBRARY)(在PREBUILT结束时差异是T而不是D)。

因此,它没有在我的主Android.mk文件中创建我尝试链接到LOCAL_SHARED_LIBRARIES := opus的库。

这就是我为预建库创建Android.mk文件的方法:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libopus
LOCAL_SRC_FILES := libopus.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)

这是我写的代码的Android.mk文件:

MY_PROJECT_PATH := $(call my-dir)
LOCAL_PATH = $(MY_PROJECT_PATH)

include $(call all-subdir-makefiles)

include $(CLEAR_VARS)
APP_ABI := armeabi armeabi-v7a
LOCAL_PATH = $(MY_PROJECT_PATH)
LOCAL_MODULE := OpusCodec
LOCAL_SHARED_LIBRARIES := libopus
LOCAL_LDLIBS += -llog -landroid
LOCAL_SRC_FILES := OpusEncoder.c OpusDecoder.c
include $(BUILD_SHARED_LIBRARY)

除了对预构建的库模块进行外观修改以及重构我的主要Android.mk文件之外,我没有必要更改内容(您不需要像我最初尝试那样指定LIB_PATH )。