2016-12-27 3 views
0

Я пытаюсь загрузить две функции из библиотеки общего объекта (.so), которую я установил, но когда я компилирую свой код, я получаю пару ошибок, когда пытаюсь использовать эти функции, вот мой код:Проблема с загрузкой функций общих объектов с помощью dlsym в C++

void G729ToPcmFilter::AudioChunkIn(AudioChunkRef& inputAudioChunk){ 

    std::string s = std::to_string(inputAudioChunk->GetNumBytes()); 
    LOG4CXX_ERROR(LOG.rootLog, CStdString("G729 AudioChunkIn Size => " + s)); 

    typedef struct bcg729DecoderChannelContextStruct_struct bcg729DecoderChannelContextStruct; 
    void *handle; 
    bcg729DecoderChannelContextStruct (*initer)(bcg729DecoderChannelContextStruct); 
    void (*decoder)(void); 
    char* error; 
    handle = dlopen ("libbcg729.so", RTLD_LAZY); 
    if (!handle) { 
      LOG4CXX_ERROR(LOG.rootLog, CStdString("Couldn't load Bcg729 plugin")); 
     } 
    else { 
      *(void **) (&initer) = dlsym(handle,"initBcg729DecoderChannel"); 
      *(void **) (&decoder) = dlsym(handle,"bcg729Decoder"); 
      if ((error = dlerror()) != NULL) { 
       std::string str(error); 
       LOG4CXX_ERROR(LOG.rootLog, CStdString("Couldn't load Bcg729 plugin's functions => "+str)); 
      } else { 
       const char* inputBuffer = reinterpret_cast<const char*>((unsigned char*)inputAudioChunk->m_pBuffer); 
       char *ret = (char*)malloc(10); 
       memcpy(ret, inputBuffer, 10); 
       char* firstFragment = ret; 
       ret = (char*)malloc(10); 
       memcpy(ret, inputBuffer+10, 10); 
       char* secondFragment = ret; 

       LOG4CXX_ERROR(LOG.rootLog, CStdString("G729 AudioChunkIn buffer separated into two 10 bit buffers")); 

       int16_t outputBuffer[80]; /* output buffer: the reconstructed signal */ 
       int16_t outputBuffer1[80]; /* output buffer: the reconstructed signal */ 
       uint8_t bitStream[10]; /* binary input for the decoder */ 

       LOG4CXX_ERROR(LOG.rootLog, CStdString("G729 AudioChunkIn Buffers Created")); 

       bcg729DecoderChannelContextStruct *decoderChannelContext = (*initer)(); 

       LOG4CXX_ERROR(LOG.rootLog, CStdString("G729 AudioChunkIn Decoder Initialized")); 

       for(int i=0; i < 10 ; i++){ 
        bitStream[i] = (uint8_t)atoi(&firstFragment[i]); 
       } 

       LOG4CXX_ERROR(LOG.rootLog, CStdString("G729 AudioChunkIn First BitStream Created")); 

       (*decoder)(decoderChannelContext, bitStream, 1, outputBuffer); 

       LOG4CXX_ERROR(LOG.rootLog, CStdString("G729 AudioChunkIn First Stream Decoding DONE")); 

       for(int i=0; i < 10 ; i++){ 
        bitStream[i] = (uint8_t)atoi(&secondFragment[i]); 
       } 

       LOG4CXX_ERROR(LOG.rootLog, CStdString("G729 AudioChunkIn Second BitStream Created")); 

       (*decoder)(decoderChannelContext, bitStream, 0, outputBuffer1); 

       LOG4CXX_ERROR(LOG.rootLog, CStdString("G729 AudioChunkIn Second Stream Decoding DONE")); 

       m_outputAudioChunk.reset(new AudioChunk()); 
       AudioChunkDetails chunkDetails = *inputAudioChunk->GetDetails(); 
       chunkDetails.m_rtpPayloadType = -1; 
       chunkDetails.m_encoding = PcmAudio; 
       chunkDetails.m_numBytes = 160; 
       short* outputBufferFinal = (short*)m_outputAudioChunk->CreateBuffer(chunkDetails); 
       for(int i = 0; i < 80; i++){ 
        outputBufferFinal[i] = outputBuffer[i]; 
        outputBufferFinal[i+80] = outputBuffer1[1]; 
       } 

      } 
    } 
} 

я получаю следующие ошибки во время компиляции, я уверен, что «м прохождения paramethers, как заявлено на .so библиотеки, я использую:

G729Codec.cpp: In member function ‘virtual void G729ToPcmFilter::AudioChunkIn(AudioChunkRef&)’: 
G729Codec.cpp:173:74: error: too few arguments to function 
    bcg729DecoderChannelContextStruct *decoderChannelContext = (*initer)(); 
                     ^
G729Codec.cpp:183:65: error: too many arguments to function 
    (*decoder)(decoderChannelContext, bitStream, 1, outputBuffer); 
                   ^
G729Codec.cpp:193:66: error: too many arguments to function 
    (*decoder)(decoderChannelContext, bitStream, 0, outputBuffer1); 

В заголовке библиотеки libbcg729.so функции объявляются следующим образом:

BCG729_VISIBILITY bcg729DecoderChannelContextStruct *initBcg729DecoderChannel(); 
BCG729_VISIBILITY void bcg729Decoder(bcg729DecoderChannelContextStruct *decoderChannelContext, uint8_t bitStream[], uint8_t frameErasureFlag, int16_t signal[]); 

Я не могу понять, что я делаю неправильно, может ли кто-нибудь мне помочь?

+0

Если функция декодера объявлена ​​как 'void bcg729Decoder (bcg729DecoderChannelContextStruct *, uint8_t [], uint8_t, int16_t []);', тогда объявление 'decoder' должно включать в себя все те же аргументы и типы. –

+0

Спасибо, что это было. Пожалуйста, отправьте это как ответ, чтобы принять его. –

ответ

1

Похоже, ваши декларации функции указателей:

bcg729DecoderChannelContextStruct (*initer)(bcg729DecoderChannelContextStruct);
void (*decoder)(void);

заблуждается, я полагаю, что они должны быть чем-то вроде:

bcg729DecoderChannelContextStruct* (*initer)();
void bcg729Decoder(... see the bcg729 library header file for the bcg729Decoder() function signature)

Вы также можете проверить, если вам нужно указать эти объявления как extern «C», так как библиотека bcg729 написана на C, а не на C++.

+0

Я отредактировал вопрос, чтобы показать подпись обеих функций, как видно из файла заголовка библиотеки bcg729. –

+0

Так ... это работает, если вы измените 2 строки после «void * handle»; в вашем коде, как я предложил? – roalz

+0

Я попытался изменить 2 строки после «void * handle»: –

Смежные вопросы