2014-02-11 41 views
0

为了努力减少应用程序的带宽使用,我试图做一个opus的实现。未定义对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 

的巨著子文件夹的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层。

的Android.mk在我JNI文件夹(其应当建立我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中公开的。有任何想法吗?

回答

0

好的,所以这一切都证明是我的一个印刷错误。 对于敏锐的观察者,为了制作预构建的作品库,我使用了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就像我最初尝试的那样)。

相关问题