Поэтому я пытаюсь использовать 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
Я забыл интегрировать одну ключевую библиотеку
Это устранило мою проблему.