经过几个小时搜索类似的问题,并尝试了许多替代方案,但没有解决方案。我把这个问题带给了 StackOverflow 的聪明头脑。我一直在尝试将 Opus 音频编解码器合并到我的 Android 项目中,但我不断收到未定义的引用错误。
其他帖子中提到的典型问题似乎并不适用。名称和路径似乎正确,包括来自 Opus 的所有头文件,我的函数头文件是由 Javah 生成的。
结构为:
jni--(dir)
--Android.mk
--opus_jni.c
--com_ether_viz_OpusCodec.h
--opus----(dir)
----Android.mk
----include---- (目录)
----src--------(目录)
顶级Android.mk:
JNIPATH := $(call my-dir)
include $(call all-subdir-makefiles)
LOCAL_PATH := $(JNIPATH)
include $(CLEAR_VARS)
LOCAL_MODULE:=opus_jni
LOCAL_SRC_FILES:= opus_jni.c
LOCAL_SHARED_LIBRARIES := opus
include $(BUILD_SHARED_LIBRARY)
opus 目录中的 Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
MY_MODULE_DIR := opus
LOCAL_MODULE := opus
LOCAL_SRC_FILES := \
$(subst $(ROOT_DIR)/$(MY_MODULE_DIR)/,,$(wildcard $(ROOT_DIR)/$(MY_MODULE_DIR)/src/*.c*)) \
$(subst $(ROOT_DIR)/$(MY_MODULE_DIR)/,,$(wildcard $(ROOT_DIR)/$(MY_MODULE_DIR)/celt/*.c*)) \
$(subst $(ROOT_DIR)/$(MY_MODULE_DIR)/,,$(wildcard $(ROOT_DIR)/$(MY_MODULE_DIR)/silk/*.c*)) \
$(subst $(ROOT_DIR)/$(MY_MODULE_DIR)/,,$(wildcard $(ROOT_DIR)/$(MY_MODULE_DIR)/silk/fixed/*.c*))
LOCAL_LDLIBS := -lm -llog
LOCAL_C_INCLUDES := \
$(ROOT_DIR)/$(MY_MODULE_DIR)/include \
$(ROOT_DIR)/$(MY_MODULE_DIR)/silk \
$(ROOT_DIR)/$(MY_MODULE_DIR)/silk/fixed \
$(ROOT_DIR)/$(MY_MODULE_DIR)/celt
LOCAL_CFLAGS := -DNULL=0 -DSOCKLEN_T=socklen_t -DLOCALE_NOT_USED -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64
LOCAL_CFLAGS += -Drestrict='' -D__EMX__ -DOPUS_BUILD -DFIXED_POINT -DUSE_ALLOCA -DHAVE_LRINT -DHAVE_LRINTF -O3 -fno-math-errno
LOCAL_CPPFLAGS := -DBSD=1
LOCAL_CPPFLAGS += -ffast-math -O3 -funroll-loops
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)
include $(BUILD_SHARED_LIBRARY)
控制台输出:
/Users/ethervision/Documents/AAAA_New/Android/android-ndk-r10b/ndk-build all
[armeabi] SharedLibrary : libopus.so
[armeabi] Install : libopus.so => libs/armeabi/libopus.so
[armeabi] Compile thumb : opus_jni <= opus_jni.c
[armeabi] SharedLibrary : libopus_jni.so
/Users/ethervision/Documents/AAAA_New/Android/android-ndk-r10b/toolchains/arm-linux-androideabi-
4.6/prebuilt/darwin-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-
androideabi/bin/ld: ./obj/local/armeabi/objs/opus_jni/opus_jni.o: in function
Java_com_plworld_partyline_OpusCodec_initOpusDecoder:jni/opus_jni.c:30:
error: undefined reference to 'opus_decoder_create'
我对 NDK 还很陌生,所以我可能只是遗漏了一些简单的东西,但我已经尝试了在这里和其他网站上找到的几十种变体。