首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未定义对opus函数的引用,同时包含适当的标头。

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

Stack Overflow用户
提问于 2014-02-11 13:28:17
回答 1查看 1.3K关注 0票数 0

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

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

所以我的文件结构如下:

代码语言:javascript
复制
/jni
  /opus
    /include
      All opus header files
    Android.mk
    libopus.so
  Android.mk
  OpusEncoder.h
  OpusDecoder.h
  OpusEncoder.c
  OpusDecoder.c

opus子文件夹中的Android.mk文件具有以下内容:

代码语言:javascript
复制
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层)如下所示:

代码语言:javascript
复制
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条错误消息:

代码语言:javascript
复制
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中公开的方法。有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-20 09:06:27

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

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

这就是我如何为预构建的库创建我的Android.mk文件:

代码语言:javascript
复制
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文件:

代码语言:javascript
复制
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 )。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21703203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档