Question

I want to use G.729 audio codec on my android application. I have did a lot research on this and came to know that pjsip is most promising solution for this. But I have not much idea about all this. can someone provide me complete steps for using pjsip in existing android application and how can i include support of G729 codec via pjsip.

Any help will be appreciated.

EDIT :

Here is my android.mk file. I want to know that,have i did this right? and how to use those C functions in my java code???

include $(CLEAR_VARS)
LOCAL_MODULE := pjsua-arm-unknown-linux-androideabi
LOCAL_SRC_FILES := $(MY_PJLIB_PATH)/libpjsua-arm-unknown-linux-androideabi.a

 PJSIP_LIBS := $(addprefix pjsip_libs/, \
 libg7221codec-arm-unknown-linux-androideabi.a \
 libg7221codec-i686-apple-darwin9.a \
 libgsmcodec-arm-unknown-linux-androideabi.a \
 libgsmcodec-i686-apple-darwin9.a \
 libilbccodec-arm-unknown-linux-androideabi.a \
 libmilenage-arm-unknown-linux-androideabi.a \
 libmilenage-i686-apple-darwin9.a \
 libpj-arm-unknown-linux-androideabi.a \
 libpj-i686-apple-darwin9.a \
 libpjlib-util-arm-unknown-linux-androideabi.a \
 libpjlib-util-i686-apple-darwin9.a \
 libpjmedia-audiodev-i686-apple-darwin9.a \
 libpjmedia-codec-i686-apple-darwin9.a \
 libpjmedia-i686-apple-darwin9.a \
 libpjmedia-videodev-i686-apple-darwin9.a \
 libpjnath-arm-unknown-linux-androideabi.a \
 libpjnath-i686-apple-darwin9.a \
 libpjsdp-i686-apple-darwin9.a \
 libpjsip-i686-apple-darwin9.a \
 libpjsip-simple-i686-apple-darwin9.a \
 libpjsip-ua-i686-apple-darwin9.a \
 libpjsua-i686-apple-darwin9.a \
 libportaudio-i686-apple-darwin9.a \
 libresample-arm-unknown-linux-androideabi.a \
 libresample-i686-apple-darwin9.a \
 libspeex-arm-unknown-linux-androideabi.a \
 libsrtp-arm-unknown-linux-androideabi.a \
 libsrtp-i686-apple-darwin9.a )

 LOCAL_STATIC_LIBRARIES := $(PJSIP_LIBS) 
 include $(PREBUILT_STATIC_LIBRARY)
Was it helpful?

Solution

First step is build pjsip source code for Android (steps for Ubuntu Linux):

  1. Set ANDROID_NDK_ROOT environment variable to your NDK's root folder.
  2. Go to pjsip 2.x folder and create pjlib/include/pj/config_site.h including config_site_sample.h (#include <pj/config_site_sample.h>)
  3. Run ./configure-android
  4. Run make clean && make depend && make

After these steps, you will have several static libraries in several folders. I suggest to group them in a same folder (better in your project) by:

mkdir <your_project_path>/pjsip_libs
find . -name *.a | xargs -I % cp % <your_project_path>/pjsip_libs/

Once you've all libraries, you need to add those libraries into your project's Android.mk file, this is done by including a new module section per library. This module section should be something like:

include $(CLEAR_VARS)
LOCAL_MODULE := pjsua-arm-unknown-linux-androideabi
LOCAL_SRC_FILES := $(MY_PJLIB_PATH)/libpjsua-arm-unknown-linux-androideabi.a
include $(PREBUILT_STATIC_LIBRARY)

And, in the section you're actually building your JNI project's source code, add all modules to your static library references:

 LOCAL_STATIC_LIBRARIES := pjsua-arm-unknown-linux-androideabi ...

This will include pjsip references into your JNI library. Now, you need to configure a pjsip UA instance.

You've a explanation about init and start pjsip's UA (pjsua) in pjsip/include/pjsua-lib/pjsua.h but main steps to follow are:

  1. Create a UA instance with pjsua_create
  2. Create a worker thread with pj_thread_create
  3. Set default configuration for UA instance:

    pjsua_config cfg; pjsua_logging_config log_cfg; pjsua_media_config media_cfg;

    pj_cli_cfg_default(&app_config.cli_cfg.cfg); pjsua_logging_config_default(&log_cfg); pjsua_media_config_default(&media_cfg);

  4. Init the stack with pjsua_init

  5. Start the stack with pjsua_start

From here, you've plenty of configuration options (log, media, transport, etc.)

You can find a basic PJSIP tutorial here and, inside pjsip's source root path, you've a basic (but complete enough for a basic SIP usage) at: pjsip-apps/src/samples/simple_pjsua.c

Edit: When building android project in pjsip-apps, you can face a problem because pjsua-app is not generated by default on the general build (more specifically, pjsua: target is not included on all: target at pjsip-apps/build/Makefile). To fix this just go to pjsip-apps/build and run:

make pjsua

This would create proper object files at: pjsip-apps/build/output/pjsua-arm-unknown-linux-androideabi/ (needed when building android sample).

Once you've all corresponding object files, you can run ndk-build again at pjsip-apps/src/pjsua/android

OTHER TIPS

To integrate the G.729 codec into your PJSIP project, you just want to get Intel IPP compilers from Intel and you can integrate them into your project easily.

Follow this link.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top