Ошибка загрузки функций общего объекта с помощью dlsym в Stack Overflow

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

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];
}

}
}
}

Я получаю следующие ошибки во время компиляции, я уверен, что передаю параметры, как объявлено в библиотеке .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

Решение

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

bcg729DecoderChannelContextStruct (* initer) (bcg729DecoderChannelContextStruct);
void (* декодер) (void);

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

bcg729DecoderChannelContextStruct * (* initer) ();
void bcg729Decoder (… см. заголовочный файл библиотеки bcg729 для сигнатуры функции bcg729Decoder ())

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector