pjsip使用最新源码编译 for android

本文详细介绍了如何使用最新pjsip源码在Android环境下进行编译的过程,包括配置、修改源码、编译命令及可能出现的问题解决方法。
pjsip使用最新源码编译 for android 

pjsip使用最新源码编译 for android

标签: pjsip-android
  9251人阅读  评论(23)  收藏  举报
  分类:
 

最近要研究一下pjsip,所以从网上查看各种资料,下载源码,我用的ndk版本是r8d,编译步骤如下:

1.首先到官网下载源码,注意的是它有两个系列1.x和2.x,好像是2.x里面添加了视频功能,最主要的是2.1以上支持android编译,所以我选择的是2.x,下载地址:svn checkout http://svn.pjsip.org/repos/pjproject/trunk pjsip2.x

2.下载源码后,修改pjsip的编译配置pjlib\include\pj\config_site.h,写入以下内容

[java]  view plain  copy
 print ?
  1. <span style="font-size:18px">#define PJ_CONFIG_ANDROID 1  
  2. #include <pj/config_site_sample.h></span>  
3.到下载的根目录pjsip2.x下面修改configure-android,在开头添加

[java]  view plain  copy
 print ?
  1. <span style="font-size:18px">ANDROID_NDK_ROOT=/opt/android-ndk-r8d</span>  
4.我不清楚配置错误还是源码的bug,可能在苹果上编译可以通过因为在pjmedia/src/pjmedia-audiodev下面有coreaudio_dev.m文件,没有对应的.c文件,所以make的时候,会提示

[java]  view plain  copy
 print ?
  1. <span style="font-size:18px">-o output/pjmedia-audiodev-arm-unknown-linux-androideabi/coreaudio_dev.o \  
  2.         ../src/pjmedia-audiodev/coreaudio_dev.m   
  3. arm-linux-androideabi-gcc: error: ../src/pjmedia-audiodev/coreaudio_dev.m: Objective-C compiler not installed on this system  
  4. make[2]: *** [output/pjmedia-audiodev-arm-unknown-linux-androideabi/coreaudio_dev.o] Error 1  
  5. </span>  

所以我把pjmedia/src/pjmedia-audiodev/coreaudio_dev.m修改为pjmedia/src/pjmedia-audiodev/coreaudio_dev.c,该一下后缀就可以了

5.到下载的根目录pjsip2.x里面,运行./configure-android

最后会出现

[java]  view plain  copy
 print ?
  1. <span style="font-size:18px">Configurations for current target have been written to 'build.mak', and 'os-auto.mak' in various build directories, and pjlib/include/pj/compat/os_auto.h.  
  2.   
  3. Further customizations can be put in:  
  4.   - 'user.mak'  
  5.   - 'pjlib/include/pj/config_site.h'  
  6.   
  7. The next step now is to run 'make dep' and 'make'.  
  8. </span>  
6.根据上面的提示我们在终端运行make dep && make

最后到

[java]  view plain  copy
 print ?
  1. <span style="font-size:18px">rm output/samples-arm-unknown-linux-androideabi/stateless_proxy.o output/samples-arm-unknown-linux-androideabi/aviplay.o output/samples-arm-unknown-linux-androideabi/strerror.o output/samples-arm-unknown-linux-androideabi/sipecho.o output/samples-arm-unknown-linux-androideabi/resampleplay.o output/samples-arm-unknown-linux-androideabi/sipstateless.o output/samples-arm-unknown-linux-androideabi/simple_pjsua.o output/samples-arm-unknown-linux-androideabi/recfile.o output/samples-arm-unknown-linux-androideabi/icedemo.o output/samples-arm-unknown-linux-androideabi/clidemo.o output/samples-arm-unknown-linux-androideabi/httpdemo.o output/samples-arm-unknown-linux-androideabi/siprtp.o output/samples-arm-unknown-linux-androideabi/stateful_proxy.o output/samples-arm-unknown-linux-androideabi/tonegen.o output/samples-arm-unknown-linux-androideabi/level.o output/samples-arm-unknown-linux-androideabi/pcaputil.o output/samples-arm-unknown-linux-androideabi/pjsip-perf.o output/samples-arm-unknown-linux-androideabi/vid_streamutil.o output/samples-arm-unknown-linux-androideabi/streamutil.o output/samples-arm-unknown-linux-androideabi/auddemo.o output/samples-arm-unknown-linux-androideabi/playsine.o output/samples-arm-unknown-linux-androideabi/aectest.o output/samples-arm-unknown-linux-androideabi/jbsim.o output/samples-arm-unknown-linux-androideabi/stereotest.o output/samples-arm-unknown-linux-androideabi/playfile.o output/samples-arm-unknown-linux-androideabi/latency.o output/samples-arm-unknown-linux-androideabi/simpleua.o output/samples-arm-unknown-linux-androideabi/confsample.o output/samples-arm-unknown-linux-androideabi/mix.o output/samples-arm-unknown-linux-androideabi/encdec.o  
  2. make[2]: Leaving directory `/pjsip2.x/pjsip-apps/build'  
  3. make[1]: Leaving directory `/pjsip2.x/pjsip-apps/build'  
  4. </span>  
编译成功。

7.然后到pjsip-apps/src/pjsua/android目录下面我们要编译android项目所需要的库,运行ndk-build,结果如下:

[java]  view plain  copy
 print ?
  1. <span style="font-size:18px">root@zhangjie:/pjsip2.x/pjsip-apps/src/pjsua/android# ndk-build  
  2. Invoking SWIG...  
  3. swig -c++ -o jni/pjsua_wrap.cpp -package org.pjsip.pjsua -outdir src/org/pjsip/pjsua -java jni/pjsua.i  
  4. Compile++ thumb  : pjsua <= pjsua_wrap.cpp  
  5. Compile++ thumb  : pjsua <= pjsua_app_callback.cpp  
  6. StaticLibrary  : libstdc++.a  
  7. SharedLibrary  : libpjsua.so  
  8. Install        : libpjsua.so => libs/armeabi/libpjsua.so</span>  

注意:

如果是编译pjsip的动态库,供java层调用,编译完静态库之后,还需要安装swig编译动态库和接口
需要swig 2.0.5以上的版本。ubuntu 12.04自带的swig是2.0.4,不符合要求,需要自行编译安装swig的新版本

<think>我们正在处理用户关于在安卓端使用PJSIP的查询。用户提供了两段引用,但明确说明这些引用仅供参考,我们需要基于用户上一次的问题和回答来构建响应。然而,由于这是新对话的开始,我们只能根据当前问题来回答。 用户问题:我想查找安卓端使用pjsip的相关信息 请问安卓端使用pjsip的方法和教程 根据引用[1]和引用[2],我们可以提取以下信息: - 引用[1]是关于PJSIP安卓端编译步骤的,其中提到了清理pjsua2示例应用(SWIG)的命令:进入pjsip-apps/src/swig目录并执行`make clean`。 - 引用[2]是关于PJSIP 2.8在Android 8上pjsua2编译和运行的教程,其中展示了一段Java代码,该代码处理注册状态通知,并枚举了可用编解码器。 然而,用户需要的是安卓端使用PJSIP的方法和教程。因此,我们应该提供一个概括性的步骤指南,包括编译PJSIP库、配置Android项目、编写代码等。 由于PJSIP是一个比较复杂的多媒体通信库,在安卓端使用它通常需要以下步骤: 1. **环境准备**:安装必要的编译工具,如NDK、SDK等。 2. **下载PJSIP源代码**:从官方网站或GitHub获取。 3. **配置编译参数**:创建配置文件(`config_site.h`)以适应安卓平台。 4. **编译PJSIP库**:使用NDK进行编译,生成静态库或动态库。 5. **创建Android项目**:在Android Studio中创建新项目。 6. **将PJSIP库集成到Android项目中**:包括库文件和头文件。 7. **编写JNI接口或使用SWIG生成的Java包装器**:PJSIP提供了SWIG接口,可以生成pjsua2的Java包装器(即pjsua2的Java API)。 8. **编写应用代码**:初始化库,创建账户,进行呼叫等。 9. **处理权限**:在AndroidManifest.xml中添加必要的权限(如互联网、录音等)。 根据引用[2]中的代码片段,我们可以看到它使用pjsua2的Java API(如`CodecInfoVector`、`MyApp.ep.codecEnum()`等)。因此,我们可以推断使用pjsua2的Java包装器是常见做法。 下面,我们将提供一个简要的教程步骤: ### 安卓端使用PJSIP步骤 1. **环境准备**: - 安装Android Studio,并安装NDK(推荐使用r18b或更高版本)和CMake。 - 确保已安装SDK,并配置好环境变量。 2. **下载PJSIP源代码**: ```bash wget https://github.com/pjsip/pjproject/archive/refs/tags/2.8.tar.gz tar -xvf 2.8.tar.gz cd pjproject-2.8 ``` 3. **配置编译选项**: - 在`pjlib/include/pj`目录下创建`config_site.h`文件,并添加以下内容: ```c #define PJ_CONFIG_ANDROID 1 #include <pj/config_site_sample.h> ``` - 根据目标Android平台设置`APP_ABI`(例如armeabi-v7a, arm64-v8a)和`APP_PLATFORM`(例如android-21)。 4. **编译PJSIP**: - 设置环境变量(例如`NDK_TOOLCHAIN_VERSION`、`ANDROID_NDK_ROOT`等)。 - 运行配置脚本并编译: ```bash export ANDROID_NDK_ROOT=/path/to/your/ndk ./configure-android make dep && make ``` 5. **构建pjsua2的Java包装器**: - 进入swig目录并编译: ```bash cd pjsip-apps/src/swig make ``` - 这将生成Java文件和JNI动态库。生成的Java文件在`java`目录,JNI库在`java/libs`目录。 6. **创建Android项目**: - 在Android Studio中创建一个新项目,选择Native C++支持。 7. **导入PJSIP库和Java包装器**: - 将生成的`java`目录下的Java文件复制到你的Android项目的`app/src/main/java`相应包中。 - 将生成的JNI库(位于`java/libs`)复制到Android项目的`app/src/main/jniLibs`目录(按ABI子目录存放)。 - 将PJSIP头文件和编译生成的静态库(位于`pjproject-2.8/pjsip-apps/src/swig/java`)链接到项目中。 8. **编写代码**: - 初始化pjsua2: ```java import org.pjsip.pjsua2.*; public class MyApp { public static Endpoint ep = new Endpoint(); public static void main(String[] argv) { ep.libCreate(); EpConfig epConfig = new EpConfig(); ep.libInit(epConfig); // 更多初始化... } } ``` - 注册账户(如引用[2]中的注册状态通知): ```java AccountConfig accCfg = new AccountConfig(); accCfg.setIdUri("sip:username@domain.com"); accCfg.getRegConfig().setRegistrarUri("sip:domain.com"); accCfg.getSipConfig().getAuthCreds().add(new AuthCredInfo("digest", "*", "username", 0, "password")); Account acc = new Account(); acc.create(accCfg); ``` 9. **添加权限**: - 在`AndroidManifest.xml`中添加: ```xml <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> ``` 10. **运行和调试**:在真机或模拟器上运行应用。 注意:由于PJSIP编译和集成较为复杂,可能会遇到各种问题,需要根据错误信息进行调整。 §§相关问题§§ 1. 如何在Android Studio中配置NDK以编译PJSIP? 2. PJSIP在安卓端使用时需要哪些权限? 3. 如何解决PJSIP在安卓上的音频问题? 4. 如何在安卓端使用PJSIP进行语音通话? </think>以下是安卓端使用 PJSIP 的方法和教程指南,整合了编译、配置和开发的完整流程: ### 一、环境准备 1. **系统要求** - Android Studio 4.0+ - Android NDK r21+(建议 r21d) - PJSIP 源码最新版 2.13 或稳定版 2.8) - JDK 11+ 2. **工具安装** ```bash # Ubuntu 示例 sudo apt install build-essential swig python3-dev ``` --- ### 二、编译 PJSIP 库(核心步骤) 1. **配置 NDK 路径** 在 `pjlib/include/pj/config_site.h` 添加: ```c #define PJ_CONFIG_ANDROID 1 #include <pj/config_site_sample.h> ``` 2. **编译命令** ```bash export ANDROID_NDK_ROOT=/path/to/your/ndk ./configure-android make dep && make clean && make ``` > 关键点:确保 NDK 版本兼容,Android 8+ 需使用 NDK r18+[^1] --- ### 三、集成到 Android 项目 1. **生成 Java 封装层** ```bash cd pjsip-apps/src/swig make clean && make ``` 生成文件位于 `java/pjsua2/src/org/pjsip/pjsua2`[^1] 2. **Android Studio 配置** - 复制 `libpjsua2.so` 到 `app/src/main/jniLibs/armeabi-v7a` - 添加 SWIG 生成的 Java 文件到 `app/src/main/java` - 配置 CMakeLists.txt 链接 PJSIP 静态库: ```cmake add_library(lib_pjsua STATIC IMPORTED) set_target_properties(lib_pjsua PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}/libpjsua2.a) ``` --- ### 四、核心代码实现 1. **初始化引擎** ```java public class PjSipService extends Service { static { System.loadLibrary("pjsua2"); } Endpoint ep = new Endpoint(); ep.libCreate(); EpConfig epConfig = new EpConfig(); ep.libInit(epConfig); } ``` 2. **注册 SIP 账户** ```java AccountConfig accCfg = new AccountConfig(); accCfg.setIdUri("sip:user@domain.com"); accCfg.getRegConfig().setRegistrarUri("sip:pbx.domain.com"); accCfg.getSipConfig().getAuthCreds().add(new AuthCredInfo("digest", "*", "username", 0, "password")); Account acc = new Account(); acc.create(accCfg, true); ``` 3. **处理注册状态回调** ```java @Override public void notifyRegState(pjsip_status_code code, String reason, int expiration) { if (code == pjsip_status_code.PJSIP_SC_OK) { Log.d("REG", "注册成功:" + reason); // 获取音频编解码器信息 CodecInfoVector codecs = ep.codecEnum(); for (int i=0; i<codecs.size(); i++) { CodecInfo info = codecs.get(i); Log.i("CODEC", info.getCodecId() + " (优先级:" + info.getPriority() + ")"); } } } ``` > 此代码展示如何获取支持的音频编解码器列表[^2] --- ### 五、常见问题解决 1. **音频权限问题** 在 `AndroidManifest.xml` 添加: ```xml <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> ``` 2. **JNI 崩溃处理** - 检查 ABI 兼容性(armeabi-v7a/arm64-v8a) - 使用 `ndk-stack` 分析崩溃日志: ```bash ndk-stack -sym project/obj/local/armeabi-v7a -dump crash.log ``` --- ### 六、完整开发资源 1. **官方文档** [PJSIP Android Compilation Guide](https://www.pjsip.org/android.htm) 2. **示例项目** [pjsip-android-builder](https://github.com/pjsip/pjproject-android-builder)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值