1. 程式人生 > >ubuntu PJSIP編譯java庫及jni生成,開放新jni介面

ubuntu PJSIP編譯java庫及jni生成,開放新jni介面

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
 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就好了。