Riferimento non definito alla function in libreria statica con NDK
Quindi sto tentando di utilizzare libopus sul mio codice nativo per un'applicazione Android. Il mio file Android.mk ha il seguente aspetto:
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)
E il mio codice in opusUtilsNative.c è simile a questo:
#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; }
E quando cerco di costruirlo, funziona bene solo se rimuovo la row che utilizza la function "opus_decoder_create" . Altrimenti ottengo questo:
error: undefined reference to 'opus_decoder_create'
Posso vedere che opus_decoder_create è chiaramente definito su opus.h, che è chiaramente incluso poiché se escludo quella row, avrò un errore per quanto riguarda le dichiarazioni opus_int16 e OpusDecoder. Come vengono incluse alcune definizioni e alcune non sono?
Qualsiasi aiuto sarà molto apprezzato.
3 Solutions collect form web for “Riferimento non definito alla function in libreria statica con NDK”
Questo era difficile. Dopo aver scavato per un po ', mi sono reso conto di non aver compilato correttamente la libreria dell'opus e non ho poi avuto un binario ARM dopo tutto.
Un buon modo per verificare se la tua libreria è stata correttamente compilata:
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
L'output dovrebbe essere simile a questo:
tables_LTP.o: ELF 32-bit LSB relocatable, ARM, version 1 (SYSV), not stripped
Altrimenti, potrebbe essere necessario controllare due volte il process di compilazione incrociata.
È errore dal linker, non dal compilatore. Hai dimenticato di aggiungere un riferimento alle librerie corrispondenti al tuo file Android.mk
, fai così:
LOCAL_LDLIBS += -lopus
Ho dimenticato di integrare una libreria di chiavi
LOCAL_LDLIBS: = -lGLESv2
Questo ha risolto il mio problema.