实现baresip NDK库导致缺少*.so文件
Implementing baresip NDK library causes lack of *.so file
我想使用 NDK 将 baresip 库实现到我的 Android 项目中。
我在 HERE 中找到了最新的“基本”演示项目。正如在自述文件中一样,我已经从另一个 repo 创建了一些本机库并放置在“分发”文件夹中。项目正在编译、安装,工作正常。与 Android 本机 sip 实现相比,这个库非常棒,使用它,忘记 permission.USE_SIP
,它是垃圾。
现在我想将 baresip 导入到我的项目中,但没有 Java/Kotlin 文件,打算自己构建。所以我的步骤:
- 已将
externalNativeBuild
个条目添加到 build.gradle
- 已将
cpp
和 distribution
文件夹复制到我的结构中的适当位置
- 使缓存无效并重新启动
并得到异常:
Build command failed.
Error while executing process C:\Android\sdk\cmake.6.4111459\bin\cmake.exe with arguments {--build C:\Android\projects\MyApplication\app.cxx\cmake\debug\armeabi-v7a --target baresip}
[1/2] Building C object CMakeFiles/baresip.dir/baresip.c.o
[2/2] Linking C shared library C:\Android\projects\MyApplication\app\build\intermediates\cmake\debug\obj\armeabi-v7a\libbaresip.so
FAILED: cmd.exe /C "..."
接下来是一些重复的行,例如:
src/video.c:331: error: undefined reference to 'atof'
src/main/main.c:944: error: undefined reference to 'signal'
src/main/main.c:775: error: undefined reference to '__FD_ISSET_chk'
src/main/main.c:690: error: undefined reference to '__FD_SET_chk'
C:/Android/projects/MyApplication/app/src/main/cpp/../../../../distribution/openssl/lib/armeabi-v7a/libcrypto.a(armcap.o):armcap.c:function OPENSSL_cpuid_setup: error: undefined reference to 'sigfillset'
并以
结尾
clang: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.
注意 app/src/main/cpp/../../../../distribution/
文件路径,在 CMakeLists
:
中声明
set(distribution_DIR ${CMAKE_SOURCE_DIR}/../../../../distribution)
对我来说,它看起来像是编译器不可见的文件,但是当我 add/remove some/any ../
错误更改为清楚地提示错误路径。除了相同的路径和层次结构在示例项目中
我试图删除 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
丢失了,为什么它没有生成?示例项目中存在哪些行使其能够构建和工作?
(是的,我的母语很弱,由于冠状病毒而失去了同事的一些支持...)
原来它有点隐藏,但没什么难的... target/compile 这个库的 SDK 版本应该至少是 21,我有 19,这就是为什么 ndk 没有正确编译...
我想使用 NDK 将 baresip 库实现到我的 Android 项目中。
我在 HERE 中找到了最新的“基本”演示项目。正如在自述文件中一样,我已经从另一个 repo 创建了一些本机库并放置在“分发”文件夹中。项目正在编译、安装,工作正常。与 Android 本机 sip 实现相比,这个库非常棒,使用它,忘记 permission.USE_SIP
,它是垃圾。
现在我想将 baresip 导入到我的项目中,但没有 Java/Kotlin 文件,打算自己构建。所以我的步骤:
- 已将
externalNativeBuild
个条目添加到 build.gradle - 已将
cpp
和distribution
文件夹复制到我的结构中的适当位置 - 使缓存无效并重新启动
并得到异常:
Build command failed.
Error while executing process C:\Android\sdk\cmake.6.4111459\bin\cmake.exe with arguments {--build C:\Android\projects\MyApplication\app.cxx\cmake\debug\armeabi-v7a --target baresip}
[1/2] Building C object CMakeFiles/baresip.dir/baresip.c.o
[2/2] Linking C shared library C:\Android\projects\MyApplication\app\build\intermediates\cmake\debug\obj\armeabi-v7a\libbaresip.so
FAILED: cmd.exe /C "..."
接下来是一些重复的行,例如:
src/video.c:331: error: undefined reference to 'atof'
src/main/main.c:944: error: undefined reference to 'signal'
src/main/main.c:775: error: undefined reference to '__FD_ISSET_chk'
src/main/main.c:690: error: undefined reference to '__FD_SET_chk'
C:/Android/projects/MyApplication/app/src/main/cpp/../../../../distribution/openssl/lib/armeabi-v7a/libcrypto.a(armcap.o):armcap.c:function OPENSSL_cpuid_setup: error: undefined reference to 'sigfillset'
并以
结尾clang: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.
注意 app/src/main/cpp/../../../../distribution/
文件路径,在 CMakeLists
:
set(distribution_DIR ${CMAKE_SOURCE_DIR}/../../../../distribution)
对我来说,它看起来像是编译器不可见的文件,但是当我 add/remove some/any ../
错误更改为清楚地提示错误路径。除了相同的路径和层次结构在示例项目中
我试图删除 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
丢失了,为什么它没有生成?示例项目中存在哪些行使其能够构建和工作?
(是的,我的母语很弱,由于冠状病毒而失去了同事的一些支持...)
原来它有点隐藏,但没什么难的... target/compile 这个库的 SDK 版本应该至少是 21,我有 19,这就是为什么 ndk 没有正确编译...