为了减少应用程序的带宽使用,我试图实现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.h
中libopus.so
公开了所有方法。有什么想法吗?
答案 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
)。