ubuntu PJSIP编译java库及jni生成,开放新jni接口

本文档详细介绍了如何在Android环境下编译PJSIP项目,包括环境搭建、配置及编译过程,并提供了开放JNI数据类型接口的具体步骤,以及如何添加自定义C/C++源文件并确保其正确编译。

1、环境搭建参照
http://blog.youkuaiyun.com/croop520/article/details/75332990

编译参照
https://trac.pjsip.org/repos/wiki/Getting-Started/Android#OtherAndroidprojects

2、进入pjproject-2.6目录执行以下命令

#NDK目录
export ANDROID_NDK_ROOT=/home/sip/android-ndk-r13b 

#安卓CPU x86  编译器版本4.9 安卓平台5.1
TARGET_ABI=x86 NDK_TOOLCHAIN_VERSION=4.9  APP_PLATFORM=android-22  ./configure-android --use-ndk-cflags 


 make dep && make clean && make

生成jni
进入pjproject-2.6/pjsip-apps/src/swig目录,执行

 $make

生成的东西就在pjproject-2.6/pjsip-apps/src/swig/java中

3、在现有的库中,增加.c和.h
例:新增如下文件
pjproject-2.6\pjsip\src\pjsip\sushj_test1.c
pjproject-2.6\pjsip\include\pjsip\sushj_test1.h
其中.h 为

 #ifndef __SUSHJ_TEST1_H__
#define __SUSHJ_TEST1_H__

#include <pjsip/sip_msg.h>

PJ_BEGIN_DECL

typedef struct sushj_test_struct1
{ 
	pj_str_t		 a;  
	pj_uint32_t		 b;   
	pj_int32_t		 c; 
} sushj_test_struct1;

PJ_DEF(pj_bool_t) sushj_test_copy1(sushj_test_struct1 *dst, sushj_test_struct1 *src);

PJ_END_DECL
#endif	

.c 为
#include <pjsip/sushj_test1.h>

PJ_DEF(pj_bool_t) sushj_test_copy1(sushj_test_struct1 *dst,sushj_test_struct1 *src)
{
	/*pj_strcpy(dst->a, src->a);*/
	dst->b = src->b;
	dst->c = src->c;
	return PJ_TRUE;

}

修改Makefie,增加sushj_test.o目标

 vim pjsip/build/Makefile
# Defines for building PJSIP core library
#
export PJSIP_SRCDIR = ../src/pjsip
export PJSIP_OBJS += $(OS_OBJS) $(M_OBJS) $(CC_OBJS) $(HOST_OBJS) \
                sip_config.o sip_multipart.o \
                sip_errno.o sip_msg.o sip_parser.o sip_tel_uri.o sip_uri.o \
                sip_endpoint.o sip_util.o sip_util_proxy.o \
                sip_resolve.o sip_transport.o sip_transport_loop.o \
                sip_transport_udp.o sip_transport_tcp.o \
                sip_transport_tls.o sip_auth_aka.o sip_auth_client.o \
                sip_auth_msg.o sip_auth_parser.o \
                sip_auth_server.o \
                sip_transaction.o sip_util_statefull.o \
                sip_dialog.o sip_ua_layer.o \
                sushj_test1.o

然后重新生成依赖和编译:
make dep && make

4、开放jni数据类型接口
还是以上面为例,进入pjproject-2.6/pjsip-apps/src/swig
安装python解析器

sudo apt-get -y install python-pycparser

或者直接去下载
https://pypi.python.org/pypi/pycparser/
下载下来,解压后,进入执行

 python setup.py install

因安装pycparser目录与pjsip里写的不一样。修改pjproject-2.6/pjsip-apps/src/swig目录下的importsym.py里的如下目录

 #       PYCPARSER_DIR="/home/bennylp/Desktop/opt/src/pycparser-master"
        PYCPARSER_DIR="/usr/share/python-pycparser/"
		
#if not os.path.exists(PYCPARSER_DIR + '/utils/fake_libc_include'):
if not os.path.exists(PYCPARSER_DIR + '/fake_libc_include'):
		
#	'-I' + PYCPARSER_DIR + '/utils/fake_libc_include',
	'-I' + PYCPARSER_DIR + '/fake_libc_include',

修改swig目录下symbols.lst,增加要开放的结构体

pjsip/sushj_test1.h             sushj_test_struct1

在pjproject-2.6/pjsip-apps/src/swig目录下执行

 make symbols

如果报

 pycparser.plyparser.ParseError: /usr/share/python-pycparser//fake_libc_include/_fake_typedefs.h:96:9: Invalid declaration
Makefile:35: recipe for target 'symbol' failed

找到pycparser中的_fake_typedefs.h对应的行,注释掉报错行,重新make。

/*typedef int jmp_buf;*/

5、开放函数接口
swig目录的pjsua2.i结尾增加:

pj_bool_t sushj_test_copy1(sushj_test_struct1 *dst, sushj_test_struct1 *src);

重新make就好了。

您的支持,是我持续创作的动力!!!!
在这里插入图片描述

<think>我们正在讨论如何编译PJSIP的动态。根据引用[4],在arm开发板上编译PJSIP生成动态共享时,使用了`--enable-shared`选项。同样,在引用[1]中,我们看到一个针对Android平台的配置示例,但其中没有明确提到动态,不过我们可以推断类似的选项同样适用。 编译PJSIP动态的一般步骤: 1. 配置环境:确保有交叉编译工具链(如果目标平台不是当前主机平台)和必要的依赖(如OpenH264等,根据需求)。 2. 运行配置脚本:使用`./configure`命令并指定`--enable-shared`来生成动态。同时,可以指定安装路径(`--prefix`)和其他选项。 3. 编译:执行`make`命令。 4. 安装:执行`make install`命令,将和头文件安装到指定目录。 以在Linux主机上编译动态为例(如果是交叉编译,则需要设置相应的环境变量和工具链): 参考引用[4]中的命令: ``` ./configure --prefix=/opt/pjproject --enable-shared make make install ``` 如果是交叉编译(如Android),则需要使用类似引用[1]中的配置,并添加`--enable-shared`选项。例如: ``` NDK_TOOLCHAIN_VERSION=clang TARGET_ABI=arm64-v8a APP_PLATFORM=android-25 ./configure-android --use-ndk-cflags --with-openh264=/path/to/openh264 --enable-shared make make install ``` 注意:引用[1]中使用了`configure-android`,这是PJSIP提供的针对Android的配置脚本,位于PJSIP的根目录下。 另外,引用[2]中提到了交叉编译时使用`--disable-libwebrtc`来禁用某些不需要的功能,以及设置`CFLAGS`等。因此,根据实际需求,可能需要调整配置选项。 总结:编译动态的关键是在配置时加上`--enable-shared`选项。 根据用户提供的引用信息,我们还可以看到: - 引用[3]提到了在Linux下使用gcc编译时链接动态的方法(但那是使用,不是编译)。 - 引用[5]介绍了PJSIP的核心模块,但未涉及编译。 因此,我们重点参考引用[1]和引用[4]的配置方法。 下面给出一个更详细的步骤说明: 步骤1:下载PJSIP源代码(假设已经下载并进入源码目录)。 步骤2:配置编译选项。 - 对于非交叉编译(在主机上编译): ./configure --prefix=/your/install/path --enable-shared - 对于Android交叉编译(使用Android NDK): # 设置环境变量,如NDK路径(根据你的环境调整) export NDK_TOOLCHAIN_VERSION=clang export TARGET_ABI=arm64-v8a export APP_PLATFORM=android-25 ./configure-android --use-ndk-cflags --with-openh264=/path/to/openh264 --enable-shared 注意:openh264的路径需要替换为实际的路径,如果不需要openh264,可以去掉`--with-openh264`选项。 步骤3:编译 make dep make 步骤4:安装 make install 这样,在安装目录(由`--prefix`指定)的lib子目录下,应该会生成动态文件(如.so文件)。 注意:在交叉编译时,可能需要先设置好交叉编译工具链的环境变量,或者通过配置脚本的参数指定。引用[1]中使用了配置脚本`configure-android`,它会自动处理Android的交叉编译设置。 如果遇到问题,可能需要检查依赖是否已经正确编译并指定路径。 根据引用[3]的经验,在链接时可能需要链接其他(如pthread),但编译本身时,配置脚本通常会处理好这些依赖。 因此,用户的问题“如何编译pjSIP动态”可以通过上述步骤完成。 生成相关问题: 1. 如何为Android平台交叉编译PJSIP动态? 2. 编译PJSIP动态时如何解决依赖问题(如OpenH264)? 3. PJSIP动态在Linux下如何链接使用? 4. 编译PJSIP动态时常见的错误及解决方法有哪些?</think>### 如何编译 PJSIP 动态 编译 PJSIP 动态的核心是启用 `--enable-shared` 配置选项,以下是具体步骤(以 Linux/Android 为例): #### 1. **基础编译流程** ```bash # 进入源码目录 cd pjproject # 配置编译选项(关键:--enable-shared) ./configure --prefix=/安装路径 --enable-shared # [^4] # 编译并安装 make dep make make install ``` - **动态位置**:安装路径的 `lib/` 目录下生成 `.so` 文件(如 `libpjmedia.so`) - **关键选项**:`--enable-shared` 显式声明生成动态 [^4] --- #### 2. **交叉编译场景(Android)** ```bash # 设置 Android NDK 环境变量 export NDK_TOOLCHAIN_VERSION=clang export TARGET_ABI=arm64-v8a export APP_PLATFORM=android-21 # 配置(支持 OpenH264 编解码) ./configure-android \ --use-ndk-cflags \ --with-openh264=/openh264路径 \ --enable-shared # [^1] ``` - **关键依赖**:需提前编译 OpenH264 的动态 [^1] - **ABI 兼容**:修改 `TARGET_ABI` 可适配 `armeabi-v7a` 等架构 --- #### 3. **常见问题解决** - **依赖缺失**: 编译时若提示 `undefined reference`,需显式链接依赖(如多线程): ```bash LDFLAGS="-lpthread -lm" ./configure --enable-shared # [^3] ``` - **静态冲突**: 添加 `--disable-static` 确保只生成动态: ```bash ./configure --enable-shared --disable-static ``` --- #### 4. **验证动态** ```bash # 查看生成的 .so 文件 find /安装路径/lib -name "*.so" # 检查依赖项 ldd libpjsua2.so # 输出应包含 libopenh264.so 等 ``` > **重要提示**: > - 交叉编译需确保 **NDK 工具链版本**与目标平台匹配(如 `APP_PLATFORM=android-21`)[^1] > - 若需最小化体积,添加 `--disable-libwebrtc` 移除 WebRTC 支持 [^2] --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值