Реализация библиотеки baresip NDK приводит к отсутствию файла * .so - PullRequest
2 голосов
/ 13 марта 2020

Я хочу внедрить baresip lib в мой Android проект с использованием NDK.

Я нашел современный демо-проект "голыми костями" в ЗДЕСЬ . Как и в readme, я создал несколько собственных библиотек из другого репозитория и поместил их в папку «дистрибутив». Проект компилируется, устанавливается, работает нормально. По сравнению с Android нативной реализацией sip эта библиотека просто великолепна, используйте ее, забудьте о permission.USE_SIP, ее руби sh.

Теперь я хочу импортировать baresip в мой проект, но без Java / Kotlin файлов, планирую собрать самостоятельно. Итак, мои шаги:

  1. Добавлены externalNativeBuild записи в build.gradle
  2. Скопированы cpp и distribution папки в соответствующие места в моей структуре
  3. Invalidate кэш и перезапуск

И получено исключение:

Сбой команды построения.

Ошибка при выполнении процесса C: \ Android \ sdk \ cmake \ 3.6.4111459 \ bin \ cmake.exe с аргументами {--build C: \ Android \ projects \ MyApplication \ app.cxx \ cmake \ debug \ armeabi-v7a --target baresip}

[1 / 2] Сборка C объекта CMakeFiles / baresip.dir / baresip. c .o

[2/2] Связывание C общей библиотеки C: \ Android \ projects \ MyApplication \ app \ build \ промежуточные звенья \ cmake \ debug \ obj \ armeabi-v7a \ libbaresip.so

FAILED: cmd.exe / C "..."

рядом некоторые дубликаты такие строки:

src / video. c: 331: ошибка: неопределенная ссылка на 'atof'

src / main / main. c: 944: ошибка: неопределенная ссылка на 'signal'

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: error: сбой команды компоновщика с кодом выхода 1 (используйте -v для просмотра вызова)

ниндзя: сборка остановлена: подкоманда завершилась неудачно.

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

cra sh все еще происходит, но когда я закомментирую if (log_level_get() < LEVEL_INFO) вызову, мой проект создается и устанавливается просто отлично ... log_level_get() исходит из baresip.h, то есть #include d, libbaresip.a файлов (за аби) присутствует, так почему же отсутствует libbaresip.so, почему он не генерирует? какие строки присутствуют в примере проекта, который заставляет его строить и работать?

(да, я довольно слаб в родном, потерял некоторую поддержку от коллег из-за коронавируса ...)

1 Ответ

2 голосов
/ 17 марта 2020

оказалось, что это было немного скрыто, но ничего сложного ... целевая / компилируемая версия SDK должна быть не менее 21 для этой библиотеки, у меня было 19, поэтому ndk не компилировалась должным образом ...

...