Неопределенная ссылка на функцию в статической библиотеке с NDK

Поэтому я пытаюсь использовать libopus в своем родном коде для приложения для Android. Мой Android.mk-файл выглядит так:

PLATFORM_PREFIX := /opt/android-ext/ LOCAL_PATH := $(PLATFORM_PREFIX)/lib include $(CLEAR_VARS) LOCAL_MODULE := libopus LOCAL_SRC_FILES := libopus.a include $(PREBUILT_STATIC_LIBRARY) # I have to redeclare LOCAL_PATH because the library is in /opt/android-ext/ # and my project is somewhere else. Not very elegant. LOCAL_PATH := /home/sergio/workspace/Project/jni include $(CLEAR_VARS) LOCAL_MODULE := opusUtilsNative LOCAL_SRC_FILES := opusUtilsNative.c LOCAL_C_INCLUDES += $(PLATFORM_PREFIX)/include LOCAL_STATIC_LIBRARIES := android_native_app_glue libopus include $(BUILD_SHARED_LIBRARY) 

И мой код в opusUtilsNative.c выглядит так:

 #include "opusUtilsNative.h" #include <opus/opus.h> #include <opus/opus_types.h> JNIEXPORT jbyteArray JNICALL Java_Project_OpusUtils_encode (JNIEnv * je, jclass jc, jbyteArray data){ int rc; opus_int16 * testOutBuffer; unsigned char* opusBuffer; OpusDecoder *dec; dec = opus_decoder_create(48000, 2, &rc); return data; } 

И когда я пытаюсь его построить, он отлично работает, только если я удалю строку, использующую функцию opus_decoder_create . Еще я получу это:

 error: undefined reference to 'opus_decoder_create' 

Я вижу, что opus_decoder_create четко определен на opus.h, который явно включен, поскольку, если я исключил эту строку, я получу ошибку в отношении объявлений opus_int16 и OpusDecoder. Почему некоторые определения включены, а некоторые нет?

Любая помощь будет оценена.

Это было сложно. Покопавшись немного, я понял, что я не перекрестно скомпилировал библиотеку opus правильно, и в конце концов у меня не было бинарного ARM.

Хороший способ проверить правильность кросс-компиляции библиотеки:

 cd /opt/android-ext/lib #Or wherever the .a file is ar x libopus.a file tables_LTP.o #Or any of the .o files generated by ar x 

Результат должен выглядеть следующим образом:

 tables_LTP.o: ELF 32-bit LSB relocatable, ARM, version 1 (SYSV), not stripped 

В противном случае вам может потребоваться дважды проверить процесс кросс-компиляции.

Это ошибка от компоновщика, а не от компилятора. Вы забыли добавить ссылку на корреспондентские библиотеки в ваш файл Android.mk , сделайте так:

 LOCAL_LDLIBS += -lopus 

Я забыл интегрировать одну ключевую библиотеку

LOCAL_LDLIBS: = -lGLESv2

Это устранило мою проблему.