前言
前面的有写过Android 使用Linphone SDK开发SIP客户端相关的文章, 在后续的开发过程中, 为了更深入了解linphone, 便尝试下载SDK源码自行编译.
关于linphone这里不作过多介绍, 可以参考前面的文章.
Linphone-SDK 是一个将 Liblinphone 及其依赖项捆绑为 git 子模块的项目,目的是简化整个 Liblinphone 套件的编译和打包,包括 Mediastreamer2、Belle-sip、oRTP 等。
它的编译生成一个 SDK,适合创建在这些组件之上运行的应用程序。非 Linphone 团队开发或维护的子模块分组在 external/ 目录中。
当前支持的平台有 Android、iOS、Desktop(Linux、Windows、Mac OS X)和 UWP(Universal Windows Platform)。
clone 代码
GitLab linphone-sdk
git clone https://gitlab.linphone.org/BC/public/linphone-sdk.git
注意: 为什么不使用GitHub上的仓库
# ********
# **注意**
# ********
#从GitHub上克隆下来的代码, 不能正常编译, 原因是有些模块找不到, 更新/下载不来.
https://github.com/BelledonneCommunications/linphone-sdk
git clone https://github.com/BelledonneCommunications/linphone-sdk.git
源码下载[2GB]
提取码: 4x4c
环境及信赖
系统: Ubuntu 20.04
内存: 16GB
存储: 512GB
工具包:
- Cmake >= 3.11
- python >= 3.6
- pip (or pip3 if the build machine has both python2 and python3)
- yasm
- nasm
- doxygen
- Pystache (use pip install pystache or pip3 install pystache)
- six (use pip install six or pip3 install six)
编译
克隆下来解压出来后, 依赖的库代码基本为空, 通过下面的命令, 可以检索出所需要库代码.
检索依赖项
Linphone-SDK 的 git 存储库包含 git 子模块。 它必须使用 --recursive 选项进行克隆。 更新或切换分支后,永远不要忘记检查和更新子模块:
git submodule update --init --recursive
这个过程需要较长的时间, 具体看网络条件, 若出现失败建议检查下网络原因, 另外考虑下是否外网访问的问题.
完成后, 目录文件 列表:
linphone-sdk$ ll
total 248
drwxrwxr-x 35 android android 4096 12月 16 15:57 ./
drwxrwxr-x 21 android android 4096 12月 16 09:22 ../
drwxrwxr-x 6 android android 4096 12月 15 20:09 bcg729/
drwxrwxr-x 10 android android 4096 12月 15 20:09 bcmatroska2/
drwxrwxr-x 8 android android 4096 12月 15 20:09 bctoolbox/
drwxrwxr-x 11 android android 4096 12月 15 20:09 bcunit/
drwxrwxr-x 9 android android 4096 12月 15 20:09 belcard/
drwxrwxr-x 9 android android 4096 12月 15 20:09 belle-sip/
drwxrwxr-x 9 android android 4096 12月 15 20:09 belr/
drwxrwxr-x 7 android android 4096 12月 15 20:09 bzrtp/
-rw-rw-r-- 1 android android 2069 12月 15 19:45 CHANGELOG.md
drwxrwxr-x 8 android android 4096 12月 16 11:00 cmake/
drwxrwxr-x 10 android android 4096 12月 15 20:09 cmake-builder/
-rw-rw-r-- 1 android android 5602 12月 15 19:45 CMakeLists.txt
drwxrwxr-x 2 android android 4096 12月 15 19:45 docker-files/
-rw-rw-r-- 1 android android 10 12月 15 19:45 .envrc
drwxrwxr-x 26 android android 4096 12月 15 19:45 external/
-rw-rw-r-- 1 android android 7121 12月 15 19:45 flake.lock
-rw-rw-r-- 1 android android 4274 12月 15 19:45 flake.nix
drwxrwxr-x 9 android android 4096 12月 15 19:46 .git/
drwxrwxr-x 3 android android 4096 12月 15 19:45 .github/
-rw-rw-r-- 1 android android 302 12月 15 19:45 .gitignore
drwxrwxr-x 9 android android 4096 12月 15 19:45 .gitlab-ci-files/
-rw-rw-r-- 1 android android 1598 12月 15 19:45 .gitlab-ci-tunnel.yml
-rw-rw-r-- 1 android android 3439 12月 15 19:45 .gitlab-ci.yml
-rw-rw-r-- 1 android android 4552 12月 15 19:45 .gitmodules
drwxrwxr-x 17 android android 4096 12月 15 20:09 liblinphone/
-rw-rw-r-- 1 android android 34523 12月 15 19:45 LICENSE.txt
drwxrwxr-x 9 android android 4096 12月 15 20:09 lime/
drwxrwxr-x 14 android android 4096 12月 15 20:09 mediastreamer2/
drwxrwxr-x 3 android android 4096 12月 15 20:09 msaaudio/
drwxrwxr-x 6 android android 4096 12月 15 20:09 msamr/
drwxrwxr-x 2 android android 4096 12月 15 20:09 msandroidcamera2/
drwxrwxr-x 3 android android 4096 12月 15 20:09 mscodec2/
drwxrwxr-x 4 android android 4096 12月 15 20:09 msoboe/
drwxrwxr-x 5 android android 4096 12月 15 20:09 msopenh264/
drwxrwxr-x 5 android android 4096 12月 15 20:09 mssilk/
drwxrwxr-x 3 android android 4096 12月 15 20:09 mswasapi/
drwxrwxr-x 4 android android 4096 12月 15 20:09 mswebrtc/
drwxrwxr-x 4 android android 4096 12月 15 20:10 mswinrtvid/
drwxrwxr-x 10 android android 4096 12月 15 20:10 ortp/
drwxrwxr-x 7 android android 4096 12月 15 20:10 postquantumcryptoengine/
-rw-rw-r-- 1 android android 13876 12月 15 19:45 README.md
drwxrwxr-x 5 android android 4096 12月 15 19:45 tester/
开始编译:
# 设置Android SDK 路径
linphone-sdk$ export ANDROID_SDK_ROOT=/home/android/Android/Sdk
# 设置Android NDK 路径
linphone-sdk$ export PATH=$PATH:/home/android/Android/Sdk/ndk/20.0.5594570
linphone-sdk$ mkdir build
linphone-sdk$ cd build
# 参考官方
linphone-sdk/build$ cmake .. -DLINPHONESDK_PLATFORM=Android -DLINPHONESDK_ANDROID_ARCHS=arm64,x86,armv7 -DENABLE_SILK=YES -DENABLE_G729==YES
# 开始编译
linphone-sdk/build$ cmake --build . -j4
编译时间比较长, 耐心等待即可.
-DLINPHONESDK_ANDROID_ARCHS的值, 可以参考:
arm -> armeabi 已不受支持:
CMake Error at /home/android/Android/Sdk/ndk/20.0.5594570/build/cmake/android.toolchain.cmake:177 (message):
armeabi is no longer supported. Use armeabi-v7a.
linphone-sdk/cmake/Android/CopyLibs.cmake
编译完成
linphone-sdk/build$ ll linphone-sdk/bin/outputs/aar/
total 198508
drwxrwxr-x 2 android android 4096 12月 17 09:50 ./
drwxrwxr-x 4 android android 4096 12月 17 09:49 ../
-rw-rw-r-- 1 android android 167525201 12月 17 09:50 linphone-sdk-android-debug.aar
-rw-rw-r-- 1 android android 35736951 12月 17 09:49 linphone-sdk-android-release.aar
生成的linphone-sdk-android-release.aar, 便可以导入给APP开发用.
导入后, 出现找不到libc++_shared.so
Caused by: java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.saike.ocs-cdHJzDKRk6PW1v0eDsFENQ==/base.apk"],nativeLibraryDirectories=[/data/app/com.saike.ocs-cdHJzDKRk6PW1v0eDsFENQ==/lib/arm, /data/app/com.saike.ocs-cdHJzDKRk6PW1v0eDsFENQ==/base.apk!/lib/armeabi-v7a, /system/lib, /vendor/lib]]] couldn't find "libc++_shared.so"
at java.lang.Runtime.loadLibrary0(Runtime.java:1011)
at java.lang.System.loadLibrary(System.java:1657)
at org.linphone.core.FactoryImpl.<clinit>(Factory.java:727)
at org.linphone.core.Factory.instance(Factory.java:49)
at com.saike.ocs.phone.SipPhone.loadSipLibs(SipPhone.java:51)
at com.saike.ocs.phone.PhoneManager$1.run(PhoneManager.java:60)
照着改, 增加一行即可
+ file(COPY "${CMAKE_ANDROID_NDK}/sources/cxx-stl/llvm-libc++/libs/${_libarch}/libc++_shared.so" DESTINATION "linphone-sdk/android-${_arch}/lib/")
参考
linphone-sdk
集成第三so之dlopen failed: library “libc++_shared.so” not found
Fixed missing libc++_shared.so that happens sometimes