http://blog.csdn.net/rx_wen/archive/2010/12/19/6085411.aspx
Port exosip to android platform isn't a difficult task because exosip
doesn't rely on any special system calls that aren't available on
android. It only requires osip to compile, which can also be easily
ported.
As an example, I created two applications to run against exosip lib. One
is a native application that can run in android shell, the other is an
java application that interact with exosip through jni. The dependency
relationship between modules is:
The diagram below depicts the organization of files. They're organized this way so that they can be compiled through android ndk
build system.
- libosip
- libexosip
- sip_exe
- sip_jni
- jni
-
Android.mk
- source files
-
Android.mk
- libs
- armeabi
- libosip.so
- libexosip.so
- libosip.so
- armeabi
- src
- java source files
- java source files
-
AndroidManifest.xml
- jni
To comply with ndk build system's requirements, we create a
directory named jni under sip_jni and sip_exe module, and place actual
source file there. The Android.mk and Application.mk (optional) are
placed in the jni directory as well. Keeping files this way, we can
issue ndk-build
command right in sip_jni or sip_exe directories to compile applications.
Note that we don't create jni directory for libosip and libexosip, their
Android.mk is placed directly under libosip and libexosip directories.
This is because they are dependent on by application modules. We don't
need compile them directly, instead, the build system will build them
automatically while building applications. In order to help build system
find libosip and libexosip, we must set NDK_MODULE_PATH environment
variable to the directory that directly containing libosip and
libexosip. The build system will search for them based on directory
name, so their names matter.
To port exosip to android, the essential task is to create the Android.mk
file, which specifies source files, c flags, ld flags, dependent
libraries. We define HAVE_TIME_H and HAVE_SYS_SELECT_H to compile exosip
successfully. And we define ENABLE_TRACE and OSIP_MT to enable logging
and multi-threading. In the last line, $
(
call
import
-
module
,
libosip
)
tells the build system that exosip depends on osip, and all header files exported by osip (
LOCAL_EXPORT_C_INCLUDES
:=
$
(
LOCAL_C_INCLUDES
)
) will be included by exosip automatically.
import-module is a feature that isn't available in the
build system in android source tree. It enables us organizing our
projects in arbitrary manner. For example, we can place libosip and
libexosip directories in another directory. The build system can still
find them as long as NDK_MODULE_PATH is set to the directory containing
them. It's much more flexible than specifying dependency relationship
with relative path.
Sample:
The sample for this post is available at:
http://code.google.com/p/rxwen-blog-stuff/source/browse/trunk/android/exosip_sample/
It shows how to:
- use ndk build system
- use stl in c++ code
- create a very basic exosip application
- call native code from java
- call java code from native code
References:
ndk document
exosip user manual