forked from pjsip/pjproject
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfull-android-builder.sh
513 lines (426 loc) · 14.8 KB
/
full-android-builder.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
#!/bin/bash
###########################################################################################################
#Script Name : PJSIP Android Builder w/TLS+VIDEO Support
#Description : This script builds PJSIP FOR ANDROID with OpenH264, OPENSSL, OPUS and BCG729
#Args : h264 openSSL <all|arm64-v8a|armeabi-v7a|x86|x86_64>
#Author : Emre TUFEKCI
#Email : [email protected]
##########################################################################################################
################################## IMPORTANT NOTE ########################################################
##### Usage: #####
##### 1- Copy the present script inside the pjproject folder #####
##### 2- chmod +x full-android-builder #####
##### 3- Run : #####
##### ./full-android-builder <all|arm64-v8a|armeabi-v7a|x86|x86_64> #####
##########################################################################################################
dt=$(date '+%d/%m/%Y %H:%M:%S')
echo "$dt : Beginning build"
# H264 -> v2.6.0 (Fev 12, 2025)
h264_link=https://github.com/cisco/openh264/archive/refs/tags/v2.6.0.zip
### OPENSSL ###
# OPENSSL -> 3.4.1 (Feb 11, 2025)
# Or BoringSSL -> 0.20250212.0 (Feb 13, 2025)
#openssl_link=https://github.com/openssl/openssl/releases/download/openssl-3.4.1/openssl-3.4.1.tar.gz
openssl_link=https://github.com/google/boringssl/releases/download/0.20250212.0/boringssl-0.20250212.0.tar.gz
### OPUS ###
# OPUS -> 1.5.2 (Sep 11, 2024)
opus_link=https://github.com/xiph/opus/releases/download/v1.5.2/opus-1.5.2.tar.gz
### BCG729 ###
# Latest Master
bcg729_link=https://github.com/BelledonneCommunications/bcg729/archive/refs/heads/master.zip
### NDK ###
# NDK -> R27c (Oct 16, 2024)
ndk_link=https://dl.google.com/android/repository/android-ndk-r27c-linux.zip
ANDROID_NDK_FOLDERNAME=android-ndk-r27c
OPENSSL_FOLDERNAME=boringssl-0.20250212.0
OPENH264_FOLDERNAME=openh264-2.6.0
OPUS_FOLDERNAME=opus-1.5.2
BCG729_FOLDERNAME=bcg729-master
ANDROID_VERSION=21
PJSIP_ADDITIONAL_OPTIONS="--disable-ilbc-codec --disable-gsm-codec --disable-l16-codec --disable-speex-codec"
PJSIP_ADDITIONAL_OPTIONS=""
WITH_BCG729_OPTION="--with-bcg729=$PWD/$BCG729_FOLDERNAME"
WITH_OPUS_OPTION="--with-opus=$PWD/$OPUS_FOLDERNAME"
WITH_SSL_OPTION="--with-ssl=$PWD/$OPENSSL_FOLDERNAME"
WITH_OPENH264_OPTION="--with-openh264=$PWD/$OPENH264_FOLDERNAME/android"
build_platform="${1^^}"
if [ "$1" = "" ] || [ -z "$1" ]
then
build_platform="ALL"
fi
echo "build platform is $build_platform"
######## IMPORTANT NOTE! ########
### YOU SHOULD RUN THIS SCRIPT AS <. android-builder.sh architecture-version> (e.g.: ". android-builder.sh arm64-v8a")
echo "-(tput setaf 3) *** PJSUA2 ANDROID BUILD SCRIPT (w/ TLS+VIDEO SUPPORT) ***"
#Go to main directory
echo "$(tput setaf 3) PJSIP MAIN DIRECTORY:"
echo $PWD
pjpath=$PWD
# Go to config_site directory
cd pjlib/include/pj/
# Remove config file (if any)
rm -rf config_site.h
# Add Config Support
echo "/* THIS <config_site.h> FILE GENERATED BY SCRIPT. Developer&Support : [[email protected]]*/
#define PJ_CONFIG_ANDROID 1
#define PJMEDIA_HAS_VIDEO 1
#define PJ_HAS_SSL_SOCK 1
#define SRTP_AES_ICM 0
#define SRTP_AES_ICM_OSSL 1
#define PJ_HAS_IPV6 1
#define PJSIP_HAS_TLS_TRANSPORT 1
#define PJSIP_MAX_PKT_LEN 8000
#define PJMEDIA_SRTP_HAS_AES_GCM_256 1
#define PJMEDIA_SRTP_HAS_AES_GCM_128 1
#define PJMEDIA_SRTP_HAS_AES_CM_256 0
#define PJMEDIA_SRTP_HAS_AES_CM_192 0
#define PJMEDIA_SRTP_HAS_AES_CM_128 0
#define PJMEDIA_HAS_OPENH264_CODEC 1
#define PJMEDIA_HAS_LIBYUV 1
#define PJMEDIA_HAS_BCG729 1
#define PJMEDIA_HAS_OPUS_CODEC 1
#define PJMEDIA_HAS_SILK_CODEC 0
#define PJMEDIA_HAS_ALAW_ULAW_TABLE 0
#define PJMEDIA_TELEPHONE_EVENT_ALL_CLOCKRATES 0
#define PJ_HAS_ERROR_STRING 0
#define PJMEDIA_RESAMPLE_IMP PJMEDIA_RESAMPLE_LIBRESAMPLE
#define PJMEDIA_HAS_ILBC_CODEC 0
#define PJMEDIA_HAS_L16_CODEC 0
#define PJMEDIA_HAS_SPEEX_AEC 0
#define PJMEDIA_HAS_SPEEX_CODEC 0
#define PJMEDIA_HAS_GSM_CODEC 0
#define PJMEDIA_HAS_AND_MEDIA_AMRNB 0
#define PJMEDIA_HAS_AND_MEDIA_AMRWB 0
#define PJ_GETHOSTIP_DISABLE_LOCAL_RESOLUTION 1
#define PJ_GETADDRINFO_USE_ANDROID 1
#include <pj/config_site_sample.h>" > config_site.h
# Go to main PJSIP directory
cd ../../../
####################################
### CLEAN PJSIP ###
####################################
# CLEAN PJSIP
# First of all make sure cleanup all existing binary.
eval make clean
# clean pjsua sample app
cd pjsip-apps/src/pjsua/android/jni/
eval make clean
# cleanup pjsua2 sample app
cd ../../../swig/
eval make clean
# Go to main PJSIP directory
cd ../../../
####################################
### ANDROID-LIB FOLDER ###
####################################
rm -rf ANDROID-LIB
mkdir ANDROID-LIB
cd ANDROID-LIB
mkdir arm64-v8a
cd arm64-v8a
mkdir java
cd ../
mkdir armeabi-v7a
cd armeabi-v7a
mkdir java
cd ../
mkdir x86
cd x86
mkdir java
cd ../
mkdir x86_64
cd x86_64
mkdir java
cd ../
# Go to main directory of pjsip
cd ../
####################################
### DOWNLOAD SWIG ###
####################################
apt install swig nasm cmake ninja-build -y
####################################
### DOWNLOAD H264 ###
####################################
###### !! IMPORTANT NOTE !! ############
# Because of some issues with NDK #
# version when building H264 #
# we're going to use prebuilt #
# binaries, following lines #
# is about the downloading & #
# building h264, for now they're #
# commented out. Please do not #
# remove them. #
########################################
### CHECK IS H264 BUILDING ###
#Check $OPENH264_FOLDERNAME folder is exist
if [ -d $OPENH264_FOLDERNAME ]
then
echo "$(tput setaf 7) Directory $OPENH264_FOLDERNAME exists."
else
echo "$(tput setaf 7) WARNING: Directory $OPENH264_FOLDERNAME does not exists. Creating..."
echo ".... Downloading H264 ...."
wget ${openh264_link}
for f in *.zip
do
unzip "$f"
rm -rf *.zip
done
fi
#Edit Makefile for openh264
cd $OPENH264_FOLDERNAME
sed -i '24s/.*/PREFIX=android/' Makefile
cd ../
####################################
### DOWNLOAD OPENSSL ###
####################################
### CHECK IS OPENSSL BUILDING ###
#Check $OPENSSL_FOLDERNAME folder is exist
if [ -d $OPENSSL_FOLDERNAME ]
then
echo "$(tput setaf 7) Directory $OPENSSL_FOLDERNAME exists."
else
echo "$(tput setaf 7) WARNING: Directory $OPENSSL_FOLDERNAME does not exists. Creating..."
echo ".... Downloading OpenSSL ...."
wget ${openssl_link}
for f in *ssl*.tar.gz
do
tar zxf "$f"
rm -rf *.tar.gz
done
fi
####################################
### DOWNLOAD OPUS ###
####################################
#Check $OPENSSL_FOLDERNAME folder is exist
if [ -d $OPUS_FOLDERNAME ]
then
echo "$(tput setaf 7) Directory $OPUS_FOLDERNAME exists."
else
echo "$(tput setaf 7) WARNING: Directory $OPUS_FOLDERNAME does not exists. Creating..."
echo ".... Downloading OPUS ...."
wget ${opus_link}
for f in *opus*.tar.gz
do
tar zxf "$f"
rm -rf *.tar.gz
done
fi
cd $OPUS_FOLDERNAME
mkdir -p jni
echo 'LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
MY_MODULE_DIR := opus
LOCAL_MODULE := $(MY_MODULE_DIR)
LOCAL_SRC_FILES := \
$(subst $(ROOT_DIR)/$(MY_MODULE_DIR)/,,$(wildcard $(ROOT_DIR)/$(MY_MODULE_DIR)/src/*.c*)) \
$(subst $(ROOT_DIR)/$(MY_MODULE_DIR)/,,$(wildcard $(ROOT_DIR)/$(MY_MODULE_DIR)/celt/*.c*)) \
$(subst $(ROOT_DIR)/$(MY_MODULE_DIR)/,,$(wildcard $(ROOT_DIR)/$(MY_MODULE_DIR)/silk/*.c*)) \
$(subst $(ROOT_DIR)/$(MY_MODULE_DIR)/,,$(wildcard $(ROOT_DIR)/$(MY_MODULE_DIR)/silk/fixed/*.c*))
LOCAL_LDLIBS := -lm -llog
LOCAL_C_INCLUDES := \
$(ROOT_DIR)/$(MY_MODULE_DIR)/include \
$(ROOT_DIR)/$(MY_MODULE_DIR)/silk \
$(ROOT_DIR)/$(MY_MODULE_DIR)/silk/fixed \
$(ROOT_DIR)/$(MY_MODULE_DIR)/celt
LOCAL_CFLAGS := -DNULL=0 -DSOCKLEN_T=socklen_t -DLOCALE_NOT_USED -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64
LOCAL_CFLAGS += -Drestrict="" -D__EMX__ -DOPUS_BUILD -DFIXED_POINT -DUSE_ALLOCA -DHAVE_LRINT -DHAVE_LRINTF -O3 -fno-math-errno
LOCAL_CPPFLAGS := -DBSD=1
LOCAL_CPPFLAGS += -ffast-math -O3 -funroll-loops
include $(BUILD_STATIC_LIBRARY)
' > jni/Android.mk
mkdir -p include/opus
mkdir -p lib
cp include/*.h include/opus/
cd ..
####################################
### DOWNLOAD-NDK ###
####################################
#Check NDK folder is exist
if [ -d $ANDROID_NDK_FOLDERNAME ]
then
echo "$(tput setaf 7) Directory $ANDROID_NDK_FOLDERNAME exists."
else
echo "$(tput setaf 7) WARNING: Directory $ANDROID_NDK_FOLDERNAME does not exists. Creating..."
echo ".... Downloading NDK ...."
wget ${ndk_link}
for f in *.zip
do
unzip "$f"
rm -rf *.zip
done
fi
####################################
### DOWNLOAD-BCG729 ###
####################################
#Check NDK folder is exist
if [ -d $BCG729_FOLDERNAME ]
then
echo "$(tput setaf 7) Directory $BCG729_FOLDERNAME exists."
else
echo "$(tput setaf 7) WARNING: Directory $BCG729_FOLDERNAME does not exists. Creating..."
echo ".... Downloading NDK ...."
wget ${bcg729_link} -O $BCG729_FOLDERNAME.zip
for f in *.zip
do
unzip "$f"
rm -rf *.zip
done
fi
####################################
### GENERIC ###
####################################
build_pjsip () {
architecture=$1
dt=$(date '+%d/%m/%Y %H:%M:%S')
echo "$dt : Begin $architecture"
if [ "$architecture" = "arm64-v8a" ]; then
otherarchname="arm64"
elif [ "$architecture" = "armeabi-v7a" ]; then
otherarchname="arm"
else
otherarchname="$architecture"
fi
### Build OPUS
export ANDROID_NDK_HOME=$PWD/$ANDROID_NDK_FOLDERNAME
export ANDROID_NDK_ROOT=$PWD/$ANDROID_NDK_FOLDERNAME
eval PATH=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin:$ANDROID_NDK_HOME/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin:$PATH
echo "OPUS Build!"
mkdir -p $OPUS_FOLDERNAME/build
cd $OPUS_FOLDERNAME/build
cmake .. -DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK_HOME}/build/cmake/android.toolchain.cmake -DANDROID_ABI=$architecture
cmake --build . -j 2 --config Release --target package
cp libopus.a ../lib/
cd ..
rm -rf build
cd ..
### Build BCG729
cd $BCG729_FOLDERNAME
cmake -DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK_HOME}/build/cmake/android.toolchain.cmake -DANDROID_ABI=$architecture -DANDROID_PLATFORM=android-${ANDROID_VERSION} -GNinja -B build
mkdir -p lib
cd build
eval ninja
eval cp ./src/*.a ../lib/
cd ../..
### Build OpenSSL
cd $OPENSSL_FOLDERNAME
if [[ $openssl_link == *"boringssl"* ]]; then
echo "BoringSSL Configure and Build!"
eval cmake -DANDROID_ABI=$architecture -DANDROID_PLATFORM=android-${ANDROID_VERSION} -DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK_HOME}/build/cmake/android.toolchain.cmake -GNinja -B build
mkdir -p lib
cd build
eval ninja
eval cp *.a ../lib/
cd ../..
elif [[ $openssl_link == *"openssl"* ]]; then
echo "OpenSSL Configure and Build!"
eval ./Configure android-$otherarchname -D__ANDROID_API__=${ANDROID_VERSION} -U__ANDROID_API__
eval make
mkdir -p lib
eval cp *.a lib/
cd ../
fi
### Build H264
cd $OPENH264_FOLDERNAME
if [ "$architecture" = "x86" ]; then
### Fix x86 problem https://github.com/cisco/openh264/issues/3747
NASM="$(command -v nasm)"
cat > nasm <<EOF
#!/bin/sh
exec "$NASM" -DX86_32_PICASM "\$@"
EOF
chmod +x nasm
export PATH="$PWD:$PATH"
fi
export PATH=$PWD/../../../Android/Sdk/tools:$PATH
rm -rf android
mkdir android
cd android
mkdir -p lib
cd ../
eval make OS=android NDKROOT=$PWD/../$ANDROID_NDK_FOLDERNAME TARGET=android-${ANDROID_VERSION} ARCH=$otherarchname
eval make OS=android NDKROOT=$PWD/../$ANDROID_NDK_FOLDERNAME TARGET=android-${ANDROID_VERSION} ARCH=$otherarchname clean
eval make install OS=android NDKROOT=$PWD/../$ANDROID_NDK_FOLDERNAME TARGET=android-${ANDROID_VERSION} ARCH=$otherarchname
if [ "$architecture" = "x86" ]; then
rm -f nasm
fi
cd ../
### Build PJSIP
eval export ANDROID_NDK_ROOT=$PWD/$ANDROID_NDK_FOLDERNAME
eval APP_PLATFORM=${ANDROID_VERSION} TARGET_ABI=$architecture ./configure-android --use-ndk-cflags $WITH_SSL_OPTION $WITH_OPENH264_OPTION $WITH_BCG729_OPTION $WITH_OPUS_OPTION $PJSIP_ADDITIONAL_OPTIONS
eval make dep && make
### Build SWIG
cd pjsip-apps/src/swig
eval make
### Copy .java files
cp -r java/android/pjsua2/src/main/java ../../../ANDROID-LIB/$architecture/java
### Copy .so files
# PJ .so
cd java/android/pjsua2/src/main/jniLibs/$architecture
cp *.so ../../../../../../../../../../ANDROID-LIB/$architecture
cd ../../../../../../../../../../
#OpenH264 .so
cd $OPENH264_FOLDERNAME
cp *.so ../ANDROID-LIB/$architecture/
cd ../
# OpenSSL .so
cd $OPENSSL_FOLDERNAME
cp *.so ../ANDROID-LIB/$architecture/
cd ../
####################################
### CLEAN OPENSSL ###
####################################
cd $OPENSSL_FOLDERNAME
eval make clean
rm -rf lib
cd ../
####################################
### CLEAN OPENH264 ###
####################################
cd $OPENH264_FOLDERNAME
eval make OS=android NDKROOT=$PWD/../$ANDROID_NDK_FOLDERNAME TARGET=android-${ANDROID_VERSION} ARCH=$otherarchname clean
eval make clean
rm -rf android
cd ../
####################################
### CLEAN PJSIP ###
####################################
eval make clean
cd pjsip-apps/src/pjsua/android/jni
eval make clean
cd ../../../swig
eval make clean
cd ../../../
dt=$(date '+%d/%m/%Y %H:%M:%S')
echo "$dt : Finished $architecture"
}
####################################
### ARM64-V8A ###
####################################
if [ "${build_platform}" = "ARM64-V8A" ] || [ "${build_platform}" = "ALL" ]
then
build_pjsip arm64-v8a
fi
####################################
### ARMEABI-V7A ###
####################################
if [ "${build_platform}" = "ARMEABI-V7A" ] || [ "${build_platform}" = "ALL" ]
then
build_pjsip armeabi-v7a
fi
####################################
### X86 ###
####################################
if [ "${build_platform}" = "X86" ] || [ "${build_platform}" = "ALL" ]
then
build_pjsip x86
fi
####################################
### X86_64 ###
####################################
if [ "${build_platform}" = "X86_64" ] || [ "${build_platform}" = "ALL" ]
then
build_pjsip x86_64
fi
echo "pjpath is"
echo $pjpath
echo "DONE !!!"