117 | | |
118 | | == Setting up the target device == |
119 | | |
120 | | To run or debug application (such as the sample applications below), first we need to setup the target device: |
121 | | - using virtual device: http://developer.android.com/tools/devices/index.html |
122 | | - using real device: http://developer.android.com/tools/device.html |
123 | | |
124 | | |
125 | | == Building and running pjsua2 sample application == #pjsua2 |
126 | | |
127 | | A sample application using [http://www.pjsip.org/docs/book-latest/html/index.html pjsua2 API] with SWIG Java binding, is located under {{{pjsip-apps/src/swig/java/android}}}. It is not built by default, and you need [http://www.swig.org/download.html SWIG] to build it. |
128 | | |
129 | | Follow these steps to build pjsua2 sample application: |
130 | | 1. Make sure SWIG is in the build environment PATH. |
131 | | 1. Run {{{make}}} from directory {{{$PJDIR/pjsip-apps/src/swig}}} (note that the Android NDK root should be in the PATH), e.g: |
132 | | {{{ |
133 | | $ cd /path/to/your/pjsip/dir |
134 | | $ cd pjsip-apps/src/swig |
135 | | $ make |
136 | | }}} |
137 | | This step should produce: |
138 | | - native library {{{libpjsua2.so}}} in {{{pjsip-apps/src/swig/java/android/app/src/main/jniLibs/armeabi}}} |
139 | | - note: if you are building for other target ABI, you'll need to manually move {{{libpjsua2.so}}} to the appropriate target ABI directory, e.g: {{{jniLibs/armeabi-v7a}}}, please check [https://developer.android.com/ndk/guides/abis.html#am here] for target ABI directory names. |
140 | | - pjsua2 Java interface (a lot of {{{.java}}} files) in {{{pjsip-apps/src/swig/java/android/app/src/main/java/org/pjsip/pjsua2}}} |
141 | | 1. Make sure any library dependencies are copied to {{{pjsip-apps/src/swig/java/android/app/src/main/jniLibs/armeabi}}} (or the appropriate target ABI directory), e.g: {{{libopenh264.so}}} for video support. |
142 | | 1. Open pjsua2 app project in Android Studio, it is located in {{{pjsip-apps/src/swig/java/android}}}. |
143 | | 1. Run it. |
144 | | |
145 | | === Log output === |
146 | | |
147 | | The pjsua2 sample application will write log messages to '''!LogCat''' window. |
148 | | |
149 | | |
150 | | == Creating your own application == #create-own-app |
151 | | |
152 | | For developing Android application, you should use [http://www.pjsip.org/docs/book-latest/html/index.html pjsua2 API] whose Java interface available via SWIG Java binding. |
153 | | |
154 | | 1. First, build {{{pjproject}}} libraries as described above. |
155 | | 1. Also build {{{pjsua2 sample application}}} as described above, this step is required to generate the pjsua2 Java interface and the native library. |
156 | | 1. Create Android application outside the PJSIP sources for your project. |
157 | | 1. Get pjsua2 Java interface and native library from pjsua2 sample application: |
158 | | 1. Copy pjsua2 Java interface files from {{{pjsip-apps/src/swig/java/android/app/src/main/java}}} to your project's {{{app/src/main/java}}} folder, e.g: |
159 | | {{{ |
160 | | $ cd $YOUR_PROJECT_DIR/app/src/main/java |
161 | | $ cp -r $PJSIP_DIR/pjsip-apps/src/swig/java/android/app/src/main/java . |
162 | | |
163 | | # Cleanup excess pjsua2 application sources. |
164 | | $ rm -r org/pjsip/pjsua2/app |
165 | | }}} |
166 | | 1. Copy native library {{{libpjsua2.so}}} from {{{pjsip-apps/src/swig/java/android/app/src/main/jniLibs}}} to your project's {{{app/src/main/jniLibs}}} folder: |
167 | | {{{ |
168 | | $ cd $YOUR_PROJECT_DIR/app/src/main/jniLibs |
169 | | $ cp -r $PJSIP_DIR/{pjsip-apps/src/swig/java/android/app/src/main/jniLibs . |
170 | | }}} |
171 | | 1. Start writing your application, please check [http://www.pjsip.org/docs/book-latest/html/index.html pjsua2 docs] for reference. |
172 | | |
173 | | |
174 | | == Pjsua application with telnet interface == #pjsua |
175 | | |
176 | | There is also the usual [http://www.pjsip.org/pjsua.htm pjsua] with telnet command line user interface, which is located under {{{pjsip-apps/src/pjsua/android}}}. It is not built by default and you need [http://www.swig.org/download.html SWIG] to build it. Application flow and user interface are handled mainly in the native level, so it doesn't use pjsua2 API with Java interface. |
177 | | |
178 | | Follow these steps to build pjsua: |
179 | | 1. Make sure SWIG is in the build environment PATH. |
180 | | - Alternatively, update SWIG path in {{{$PJDIR/pjsip-apps/src/pjsua/android/jni/Makefile}}} file. |
181 | | 1. Run {{{make}}} from directory {{{$PJDIR/pjsip-apps/src/pjsua/android/jni}}} (note that the Android NDK root should be in the PATH), e.g: |
182 | | {{{ |
183 | | $ cd /path/to/your/pjsip/dir |
184 | | $ cd pjsip-apps/src/pjsua/android/jni |
185 | | $ make |
186 | | }}} |
187 | | 1. Open pjsua2 app project in Android Studio, it is located in {{{pjsip-apps/src/pjsua/android}}}. |
188 | | 1. Run it. |
189 | | 1. You will see telnet instructions on the device's screen. Telnet to this address to operate the application. See [wiki:PJSUA-CLI PJSUA CLI Manual] for command reference. |
190 | | |
191 | | |
192 | | {{{#!comment |
193 | | |
194 | | == Debugging native code with Eclipse == #debug-native |
195 | | |
196 | | Here are the steps for debugging PJSIP native code using Eclipse: |
197 | | 1. Build PJSIP with debugging enabled, e.g: insert {{{CFLAGS += -g}}} into {{{user.mak}}} in PJSIP root directory. |
198 | | 1. Make sure that the JNI part of the application is built using {{{ndk-build}}}. For reference, check pjsua's {{{Android.mk}}} build config in {{{pjsip-apps/src/pjsua/android/jni}}}, it contains sample of how to import PJSIP build settings (build search paths, build flags, etc) and SWIG invocation. |
199 | | 1. Enable NDK plugin for Eclipse, check [http://tools.android.com/recent/usingthendkplugin this] and follow the instructions. |
200 | | - CDT can also be fetched from [http://www.eclipse.org/cdt/downloads.php CDT download page], normally Eclipse for C/C++ will have CDT installed, just make sure that the CDT version is 7.0.2 or newer. |
201 | | 1. It is recommended to introduce delay (about 5 seconds) in the application code between loading the native code library and calling any native functions (to be debugged), e.g: |
202 | | {{{ |
203 | | try { |
204 | | System.loadLibrary("some_native_lib.so"); |
205 | | } catch (UnsatisfiedLinkError e) { |
206 | | return -1; |
207 | | } |
208 | | |
209 | | // Wait for GDB init |
210 | | if ((getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) { |
211 | | try { |
212 | | Thread.sleep(5000); |
213 | | } catch (InterruptedException e) { } |
214 | | } |
215 | | |
216 | | // Start calling native functions here |
217 | | // ... |
218 | | }}} |
219 | | 1. Load the PJSIP project to Eclipse (if not yet), and try put breakpoint anywhere in the PJSIP code before launching the Android application debug configuration in Eclipse. |
220 | | |
221 | | }}} |
222 | | |
| 193 | == Trying our sample application and creating your own |
| 194 | |
| 195 | === Setting up the target device === |
| 196 | |
| 197 | To run or debug application (such as the sample applications below), first we need to setup the target device: |
| 198 | - using virtual device: http://developer.android.com/tools/devices/index.html |
| 199 | - using real device: http://developer.android.com/tools/device.html |
| 200 | |
| 201 | |
| 202 | === Building and running pjsua2 sample application === #pjsua2 |
| 203 | |
| 204 | A sample application using [http://www.pjsip.org/docs/book-latest/html/index.html pjsua2 API] with SWIG Java binding, is located under {{{pjsip-apps/src/swig/java/android}}}. It is not built by default, and you need [http://www.swig.org/download.html SWIG] to build it. |
| 205 | |
| 206 | Follow these steps to build pjsua2 sample application: |
| 207 | 1. Make sure SWIG is in the build environment PATH. |
| 208 | 1. Run {{{make}}} from directory {{{$PJDIR/pjsip-apps/src/swig}}} (note that the Android NDK root should be in the PATH), e.g: |
| 209 | {{{ |
| 210 | $ cd /path/to/your/pjsip/dir |
| 211 | $ cd pjsip-apps/src/swig |
| 212 | $ make |
| 213 | }}} |
| 214 | This step should produce: |
| 215 | - native library {{{libpjsua2.so}}} in {{{pjsip-apps/src/swig/java/android/app/src/main/jniLibs/armeabi}}} |
| 216 | - note: if you are building for other target ABI, you'll need to manually move {{{libpjsua2.so}}} to the appropriate target ABI directory, e.g: {{{jniLibs/armeabi-v7a}}}, please check [https://developer.android.com/ndk/guides/abis.html#am here] for target ABI directory names. |
| 217 | - pjsua2 Java interface (a lot of {{{.java}}} files) in {{{pjsip-apps/src/swig/java/android/app/src/main/java/org/pjsip/pjsua2}}} |
| 218 | 1. Make sure any library dependencies are copied to {{{pjsip-apps/src/swig/java/android/app/src/main/jniLibs/armeabi}}} (or the appropriate target ABI directory), e.g: {{{libopenh264.so}}} for video support. |
| 219 | 1. Open pjsua2 app project in Android Studio, it is located in {{{pjsip-apps/src/swig/java/android}}}. |
| 220 | 1. Run it. |
| 221 | |
| 222 | ==== Log output ==== |
| 223 | |
| 224 | The pjsua2 sample application will write log messages to '''!LogCat''' window. |
| 225 | |
| 226 | |
| 227 | === Creating your own application === #create-own-app |
| 228 | |
| 229 | For developing Android application, you should use [http://www.pjsip.org/docs/book-latest/html/index.html pjsua2 API] whose Java interface available via SWIG Java binding. |
| 230 | |
| 231 | 1. First, build {{{pjproject}}} libraries as described above. |
| 232 | 1. Also build {{{pjsua2 sample application}}} as described above, this step is required to generate the pjsua2 Java interface and the native library. |
| 233 | 1. Create Android application outside the PJSIP sources for your project. |
| 234 | 1. Get pjsua2 Java interface and native library from pjsua2 sample application: |
| 235 | 1. Copy pjsua2 Java interface files from {{{pjsip-apps/src/swig/java/android/app/src/main/java}}} to your project's {{{app/src/main/java}}} folder, e.g: |
| 236 | {{{ |
| 237 | $ cd $YOUR_PROJECT_DIR/app/src/main/java |
| 238 | $ cp -r $PJSIP_DIR/pjsip-apps/src/swig/java/android/app/src/main/java . |
| 239 | |
| 240 | # Cleanup excess pjsua2 application sources. |
| 241 | $ rm -r org/pjsip/pjsua2/app |
| 242 | }}} |
| 243 | 1. Copy native library {{{libpjsua2.so}}} from {{{pjsip-apps/src/swig/java/android/app/src/main/jniLibs}}} to your project's {{{app/src/main/jniLibs}}} folder: |
| 244 | {{{ |
| 245 | $ cd $YOUR_PROJECT_DIR/app/src/main/jniLibs |
| 246 | $ cp -r $PJSIP_DIR/{pjsip-apps/src/swig/java/android/app/src/main/jniLibs . |
| 247 | }}} |
| 248 | 1. Start writing your application, please check [http://www.pjsip.org/docs/book-latest/html/index.html pjsua2 docs] for reference. |
| 249 | |
| 250 | |
| 251 | === Pjsua sample application with telnet interface === #pjsua |
| 252 | |
| 253 | There is also the usual [http://www.pjsip.org/pjsua.htm pjsua] with telnet command line user interface, which is located under {{{pjsip-apps/src/pjsua/android}}}. It is not built by default and you need [http://www.swig.org/download.html SWIG] to build it. Application flow and user interface are handled mainly in the native level, so it doesn't use pjsua2 API with Java interface. |
| 254 | |
| 255 | Follow these steps to build pjsua: |
| 256 | 1. Make sure SWIG is in the build environment PATH. |
| 257 | - Alternatively, update SWIG path in {{{$PJDIR/pjsip-apps/src/pjsua/android/jni/Makefile}}} file. |
| 258 | 1. Run {{{make}}} from directory {{{$PJDIR/pjsip-apps/src/pjsua/android/jni}}} (note that the Android NDK root should be in the PATH), e.g: |
| 259 | {{{ |
| 260 | $ cd /path/to/your/pjsip/dir |
| 261 | $ cd pjsip-apps/src/pjsua/android/jni |
| 262 | $ make |
| 263 | }}} |
| 264 | 1. Open pjsua2 app project in Android Studio, it is located in {{{pjsip-apps/src/pjsua/android}}}. |
| 265 | 1. Run it. |
| 266 | 1. You will see telnet instructions on the device's screen. Telnet to this address to operate the application. See [wiki:PJSUA-CLI PJSUA CLI Manual] for command reference. |
| 267 | |
| 268 | |
| 269 | {{{#!comment |
| 270 | |
| 271 | == Debugging native code with Eclipse == #debug-native |
| 272 | |
| 273 | Here are the steps for debugging PJSIP native code using Eclipse: |
| 274 | 1. Build PJSIP with debugging enabled, e.g: insert {{{CFLAGS += -g}}} into {{{user.mak}}} in PJSIP root directory. |
| 275 | 1. Make sure that the JNI part of the application is built using {{{ndk-build}}}. For reference, check pjsua's {{{Android.mk}}} build config in {{{pjsip-apps/src/pjsua/android/jni}}}, it contains sample of how to import PJSIP build settings (build search paths, build flags, etc) and SWIG invocation. |
| 276 | 1. Enable NDK plugin for Eclipse, check [http://tools.android.com/recent/usingthendkplugin this] and follow the instructions. |
| 277 | - CDT can also be fetched from [http://www.eclipse.org/cdt/downloads.php CDT download page], normally Eclipse for C/C++ will have CDT installed, just make sure that the CDT version is 7.0.2 or newer. |
| 278 | 1. It is recommended to introduce delay (about 5 seconds) in the application code between loading the native code library and calling any native functions (to be debugged), e.g: |
| 279 | {{{ |
| 280 | try { |
| 281 | System.loadLibrary("some_native_lib.so"); |
| 282 | } catch (UnsatisfiedLinkError e) { |
| 283 | return -1; |
| 284 | } |
| 285 | |
| 286 | // Wait for GDB init |
| 287 | if ((getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) { |
| 288 | try { |
| 289 | Thread.sleep(5000); |
| 290 | } catch (InterruptedException e) { } |
| 291 | } |
| 292 | |
| 293 | // Start calling native functions here |
| 294 | // ... |
| 295 | }}} |
| 296 | 1. Load the PJSIP project to Eclipse (if not yet), and try put breakpoint anywhere in the PJSIP code before launching the Android application debug configuration in Eclipse. |
| 297 | |
| 298 | }}} |
| 299 | |
| 300 | |