Я хочу внедрить библиотеку baresip в свой проект Android с помощью NDK.
Я нашел свежий демо-проект голых костей в ЗДЕСЬ. Как и в файле readme, я создал несколько нативных библиотек из другого репозитория и поместил их в папку с дистрибутивом. Проект компилируется, устанавливается, работает нормально. По сравнению с нативной реализацией sip для Android, эта библиотека просто потрясающая, используйте ее, забудьте о permission.USE_SIP
, ее мусоре.
Теперь я хочу импортировать baresip в свой проект, но без файлов Java/Kotlin, планирую создать собственный. Итак, мои шаги:
- Добавлено
externalNativeBuild
записей в build.gradle - Скопировал папки
cpp
иdistribution
в нужные места в моей структуре - Недействительный кеш и перезапустить
И получил исключение:
Команда сборки не удалась.
Ошибка при выполнении процесса C:\Android\sdk\cmake\3.6.4111459\bin\cmake.exe с аргументами {--build C:\Android\projects\MyApplication\app.cxx\cmake\debug\armeabi-v7a -- целевой голый глоток}
[1/2] Создание объекта C CMakeFiles/baresip.dir/baresip.c.o
[2/2] Связывание общей библиотеки C C:\Android\projects\MyApplication\app\build\intermediates\cmake\debug\obj\armeabi-v7a\libbaresip.so
ОШИБКА: cmd.exe /C ...
затем несколько повторяющихся строк, например:
src/video.c:331: ошибка: неопределенная ссылка на 'atof'
src/main/main.c:944: ошибка: неопределенная ссылка на «сигнал»
src/main/main.c:775: ошибка: неопределенная ссылка на '__FD_ISSET_chk'
src/main/main.c:690: ошибка: неопределенная ссылка на '__FD_SET_chk'
C:/Android/projects/MyApplication/app/src/main/cpp/../../../../distribution/openssl/lib/armeabi-v7a/libcrypto.a(armcap.o):armcap. c: функция OPENSSL_cpuid_setup: ошибка: неопределенная ссылка на «sigfillset»
и заканчивается
clang: ошибка: команда компоновщика не удалась с кодом выхода 1 (используйте -v, чтобы увидеть вызов)
ниндзя: сборка остановлена: подкоманда не удалась.
обратите внимание на путь к файлам app/src/main/cpp/../../../../distribution/
, как указано в CMakeLists
:
set(distribution_DIR ${CMAKE_SOURCE_DIR}/../../../../distribution)
Для меня это выглядит как невидимые файлы для компилятора, но когда я добавляю/удаляю некоторые/любые ошибки ../
, они явно указывают на неверный путь. кроме того же пути и иерархии в примере проекта
Я пытался удалить файл baresip.c
, но он вылетает, просто регистрируя вызов OnLoad
...
#include <string.h>
#include <pthread.h>
#include <jni.h>
#include <android/log.h>
#include <stdlib.h>
#include <re.h>
#include <baresip.h>
#define LOGD(...) \
if (log_level_get() < LEVEL_INFO) ((void)__android_log_print(ANDROID_LOG_DEBUG, "Baresip Lib", __VA_ARGS__))
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) {
LOGD("at JNI_OnLoad\n");
return JNI_VERSION_1_6;
}
сбой все еще происходит, но когда я закомментирую вызов if (log_level_get() < LEVEL_INFO)
, мой проект строится и устанавливается просто отлично... log_level_get()
исходит из baresip.h
, который представляет собой #include
d, libbaresip.a
файлов (согласно abi), так почему же libbaresip.so
отсутствует, почему его нет генерация? какие строки присутствуют в примере проекта, что заставляет его строить и работать?
(да, я довольно слаб в нативе, потерял поддержку коллег из-за коронавируса...)