Получить искаженное имя функции при использовании общей библиотеки .so со стороны Android c ? (libAudioFlinger.so )

#android #c #c #android-ndk #shared-libraries

#Android #c #c #android-ndk #разделяемые библиотеки

Вопрос:

я работаю над этой проблемой уже 2 недели, я интегрировал код C в свое приложение для записи Voip-звонков, предполагается, что код позаботится о принудительной настройке Input_source для MediaRecorder на тот же, что и для Voip-вызова (в моем случае это input_source= 7 / Voice_Communication). Для достижения своей цели я загружаю разделяемую библиотеку: libaudioflinger.so и попытайтесь достичь функции setParameters, как видно из приведенного ниже снипета :

 handleLibAudioFlinger = dlopen("libaudioflinger.so", RTLD_LAZY | RTLD_GLOBAL);

    if (handleLibAudioFlinger != NULL) {
        func = dlsym(handleLibAudioFlinger, "setParameters"); // i do not know the mangled name of 
                                                                 SetParameters function
        if (func != NULL) {
            __android_log_print(ANDROID_LOG_ERROR, "TRACKERS", "%s", "Function is not null");
            result = 0;
        }
        audioSetParameters = (lasp) func;
    } else {
        __android_log_print(ANDROID_LOG_ERROR, "TRACKERS", "%s", "Function is null");
        result = -1;
    }
 

dlopen не возвращает null, но dlsym возвращает, причина в том, что мне нужно иметь точное искаженное имя функции setParameters из AudioFlinger.cpp Как и в исходном коде Android.

я новичок в обработке кода Android c и работе с разделяемыми библиотеками и т. Д. … Если кто-нибудь может рассказать мне шаг за шагом, как получить правильное искаженное имя для нужной мне функции?

Комментарии:

1. Разве вы не можете извлечь файл .so с устройства и запустить что-то вроде strings libaudioflinger.so | grep setParameters ? Обратите внимание, что если вы собираетесь полагаться на такие детали, как искаженное имя, вам, вероятно, следует связать определенную версию libaudioflinger.so с помощью вашего приложения.

2. Используете ли вы корневое устройство? Потому что «libaudioflinger.so недоступен из NDK, это системная библиотека AOSP.

3. по сути, я пытаюсь имитировать CallrecorderFix.c, предоставляемый CallRecLib, как вы можете видеть по следующей ссылке: github.com/ViktorDegtyarev/CallRecLib/blob/master/library/src /… там они ссылаются на библиотеку в LIbmedia.so с его искаженным именем, я не знаю почему, но их apporaches работает на всех Android <= 7, поэтому я пытаюсь имитироватьэто и возвращает setParameters из libAudioFlinger.so

4. Я понимаю, что вы хотите сделать, меня беспокоило, укоренено ли ваше устройство или нет, потому что, если ваше приложение не является системным приложением, вы даже не сможете dlopen("libaudioflinger.so") успешно выполнить вызов, но если вы написали, что оно вернуло not NULL, кажется, что оно укоренено.

5. я понимаю, этот подход должен был быть для корневых и некорневых устройств, поскольку CallRecLib указывает решение, для которого не требуется root, мой телефон укоренен, но я хочу, чтобы это работало и на некорневых устройствах, как мне поступить дальше? включить libaudioflinger в проект как файл .so? если да, то как я могу его получить, я имею в виду, откуда я могу его загрузить? или мне нужно дополнить AOSP? и искаженное имя функции сохраняется….