前言
前面的有写过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