2014-02-11 53 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就像我最初嘗試的那樣)。

相關問題