Skip to content
This repository was archived by the owner on Jan 6, 2025. It is now read-only.

Commit 55700fb

Browse files
committed
update the packaging for android arm-v7a and arm-v7a-neon architectures and remove custom abi rules for releases, fixes #511
1 parent 4be74be commit 55700fb

File tree

9 files changed

+151
-225
lines changed

9 files changed

+151
-225
lines changed

Diff for: android.sh

+11-21
Original file line numberDiff line numberDiff line change
@@ -726,22 +726,14 @@ while [ ! $# -eq 0 ]; do
726726
done
727727

728728
# DETECT BUILD TYPE
729-
rm -f ${BASEDIR}/android/jni/Android.mk 1>>${BASEDIR}/build.log 2>&1
730729
rm -f ${BASEDIR}/android/app/build.gradle 1>>${BASEDIR}/build.log 2>&1
731730
if [[ ! -z ${BUILD_LTS} ]]; then
732731
enable_lts_build
733732
BUILD_TYPE_ID+="LTS "
734733

735-
cp ${BASEDIR}/tools/ndk/Android.lts.mk ${BASEDIR}/android/jni/Android.mk 1>>${BASEDIR}/build.log 2>&1
736734
cp ${BASEDIR}/tools/release/android/build.lts.gradle ${BASEDIR}/android/app/build.gradle 1>>${BASEDIR}/build.log 2>&1
737735
else
738-
cp ${BASEDIR}/tools/ndk/Android.mk ${BASEDIR}/android/jni/Android.mk 1>>${BASEDIR}/build.log 2>&1
739736
cp ${BASEDIR}/tools/release/android/build.gradle ${BASEDIR}/android/app/build.gradle 1>>${BASEDIR}/build.log 2>&1
740-
741-
if [[ -z ${BUILD_FORCE} ]] && [[ ${ENABLED_ARCHITECTURES[${ARCH_ARM_V7A}]} -eq 1 ]]; then
742-
echo -e "INFO: Disabled arm-v7a architecture which is not included in Main releases.\n" 1>>${BASEDIR}/build.log 2>&1
743-
disable_arch "arm-v7a"
744-
fi
745737
fi
746738

747739
if [[ ! -z ${DISPLAY_HELP} ]]; then
@@ -770,14 +762,6 @@ echo -e "\nBuilding mobile-ffmpeg ${BUILD_TYPE_ID}library for Android\n"
770762
echo -e -n "INFO: Building mobile-ffmpeg ${BUILD_VERSION} ${BUILD_TYPE_ID}library for Android: " 1>>${BASEDIR}/build.log 2>&1
771763
echo -e $(date) 1>>${BASEDIR}/build.log 2>&1
772764

773-
# PERFORM THIS CHECK ONLY ON LTS
774-
if [[ ! -z ${MOBILE_FFMPEG_LTS_BUILD} ]] && [[ ${ENABLED_ARCHITECTURES[0]} -eq 0 ]] && [[ ${ENABLED_ARCHITECTURES[1]} -eq 1 ]]; then
775-
ENABLED_ARCHITECTURES[ARCH_ARM_V7A]=1
776-
777-
echo -e "(*) arm-v7a architecture enabled since arm-v7a-neon will be built\n"
778-
echo -e "(*) arm-v7a architecture enabled since arm-v7a-neon will be built\n" 1>>${BASEDIR}/build.log 2>&1
779-
fi
780-
781765
print_enabled_architectures
782766
print_enabled_libraries
783767
print_reconfigure_requested_libraries
@@ -834,15 +818,21 @@ done
834818

835819
export API=${ORIGINAL_API}
836820

837-
rm -f ${BASEDIR}/android/build/.neon 1>>${BASEDIR}/build.log 2>&1
821+
rm -f ${BASEDIR}/android/build/.armv7 1>>${BASEDIR}/build.log 2>&1
822+
rm -f ${BASEDIR}/android/build/.armv7neon 1>>${BASEDIR}/build.log 2>&1
838823
ANDROID_ARCHITECTURES=""
839-
if [[ ${ENABLED_ARCHITECTURES[1]} -eq 1 ]]; then
824+
if [[ ${ENABLED_ARCHITECTURES[0]} -eq 1 ]] || [[ ${ENABLED_ARCHITECTURES[1]} -eq 1 ]]; then
840825
ANDROID_ARCHITECTURES+="$(get_android_arch 0) "
826+
fi
827+
if [[ ${ENABLED_ARCHITECTURES[0]} -eq 1 ]]; then
841828
mkdir -p ${BASEDIR}/android/build 1>>${BASEDIR}/build.log 2>&1
842-
cat >"${BASEDIR}/android/build/.neon" <<EOF
829+
cat >"${BASEDIR}/android/build/.armv7" <<EOF
830+
EOF
831+
fi
832+
if [[ ${ENABLED_ARCHITECTURES[1]} -eq 1 ]]; then
833+
mkdir -p ${BASEDIR}/android/build 1>>${BASEDIR}/build.log 2>&1
834+
cat >"${BASEDIR}/android/build/.armv7neon" <<EOF
843835
EOF
844-
elif [[ ${ENABLED_ARCHITECTURES[0]} -eq 1 ]]; then
845-
ANDROID_ARCHITECTURES+="$(get_android_arch 0) "
846836
fi
847837
if [[ ${ENABLED_ARCHITECTURES[2]} -eq 1 ]]; then
848838
ANDROID_ARCHITECTURES+="$(get_android_arch 2) "

Diff for: android/app/src/main/java/com/arthenica/mobileffmpeg/Config.java

+40-26
Original file line numberDiff line numberDiff line change
@@ -85,51 +85,65 @@ public class Config {
8585

8686
Log.i(Config.TAG, "Loading mobile-ffmpeg.");
8787

88-
/* LOAD NOT-LOADED LIBRARIES ON API < 21 */
88+
boolean nativeFFmpegLoaded = false;
89+
boolean nativeFFmpegTriedAndFailed = false;
8990
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
91+
92+
/* LOADING LIBRARIES MANUALLY ON API < 21 */
9093
final List<String> externalLibrariesEnabled = getExternalLibraries();
9194
if (externalLibrariesEnabled.contains("tesseract") || externalLibrariesEnabled.contains("x265") || externalLibrariesEnabled.contains("snappy") || externalLibrariesEnabled.contains("openh264") || externalLibrariesEnabled.contains("rubberband")) {
92-
// libc++_shared.so included only when tesseract or x265 is enabled
9395
System.loadLibrary("c++_shared");
9496
}
95-
System.loadLibrary("avutil");
96-
System.loadLibrary("swscale");
97-
System.loadLibrary("swresample");
98-
System.loadLibrary("avcodec");
99-
System.loadLibrary("avformat");
100-
System.loadLibrary("avfilter");
101-
System.loadLibrary("avdevice");
97+
98+
if (AbiDetect.ARM_V7A.equals(AbiDetect.getNativeAbi())) {
99+
try {
100+
System.loadLibrary("avutil_neon");
101+
System.loadLibrary("swscale_neon");
102+
System.loadLibrary("swresample_neon");
103+
System.loadLibrary("avcodec_neon");
104+
System.loadLibrary("avformat_neon");
105+
System.loadLibrary("avfilter_neon");
106+
System.loadLibrary("avdevice_neon");
107+
nativeFFmpegLoaded = true;
108+
} catch (final UnsatisfiedLinkError e) {
109+
Log.i(Config.TAG, "NEON supported armeabi-v7a ffmpeg library not found. Loading default armeabi-v7a library.", e);
110+
nativeFFmpegTriedAndFailed = true;
111+
}
112+
}
113+
114+
if (!nativeFFmpegLoaded) {
115+
System.loadLibrary("avutil");
116+
System.loadLibrary("swscale");
117+
System.loadLibrary("swresample");
118+
System.loadLibrary("avcodec");
119+
System.loadLibrary("avformat");
120+
System.loadLibrary("avfilter");
121+
System.loadLibrary("avdevice");
122+
}
102123
}
103124

104125
/* ALL MOBILE-FFMPEG LIBRARIES LOADED AT STARTUP */
105126
Abi.class.getName();
106127
FFmpeg.class.getName();
107128
FFprobe.class.getName();
108129

109-
/*
110-
* NEON supported arm-v7a library has a different name
111-
*/
112-
boolean nativeLibraryLoaded = false;
113-
if (AbiDetect.ARM_V7A.equals(AbiDetect.getNativeAbi())) {
114-
if (AbiDetect.isNativeLTSBuild()) {
130+
boolean nativeMobileFFmpegLoaded = false;
131+
if (!nativeFFmpegTriedAndFailed && AbiDetect.ARM_V7A.equals(AbiDetect.getNativeAbi())) {
132+
try {
115133

116134
/*
117-
* IF CPU SUPPORTS ARM-V7A-NEON THE TRY TO LOAD IT FIRST. IF NOT LOAD DEFAULT ARM-V7A
135+
* THE TRY TO LOAD ARM-V7A-NEON FIRST. IF NOT LOAD DEFAULT ARM-V7A
118136
*/
119137

120-
try {
121-
System.loadLibrary("mobileffmpeg_armv7a_neon");
122-
nativeLibraryLoaded = true;
123-
AbiDetect.setArmV7aNeonLoaded(true);
124-
} catch (final UnsatisfiedLinkError e) {
125-
Log.i(Config.TAG, "NEON supported armeabi-v7a library not found. Loading default armeabi-v7a library.", e);
126-
}
127-
} else {
138+
System.loadLibrary("mobileffmpeg_armv7a_neon");
139+
nativeMobileFFmpegLoaded = true;
128140
AbiDetect.setArmV7aNeonLoaded(true);
141+
} catch (final UnsatisfiedLinkError e) {
142+
Log.i(Config.TAG, "NEON supported armeabi-v7a mobileffmpeg library not found. Loading default armeabi-v7a library.", e);
129143
}
130144
}
131145

132-
if (!nativeLibraryLoaded) {
146+
if (!nativeMobileFFmpegLoaded) {
133147
System.loadLibrary("mobileffmpeg");
134148
}
135149

@@ -503,7 +517,7 @@ public static String getFFmpegVersion() {
503517
* @return MobileFFmpeg version
504518
*/
505519
public static String getVersion() {
506-
if (AbiDetect.isNativeLTSBuild()) {
520+
if (isLTSBuild()) {
507521
return String.format("%s-lts", getNativeVersion());
508522
} else {
509523
return getNativeVersion();

Diff for: android/jni/Android.mk

+69-21
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,32 @@
1-
LOCAL_PATH := $(call my-dir)
2-
$(call import-add-path, $(LOCAL_PATH))
3-
FFMPEG_INCLUDES := $(LOCAL_PATH)/../../prebuilt/android-$(TARGET_ARCH)/ffmpeg/include
1+
MY_LOCAL_PATH := $(call my-dir)
2+
$(call import-add-path, $(MY_LOCAL_PATH))
3+
4+
MY_ARMV7 := false
5+
MY_ARMV7_NEON := false
6+
ifeq ($(TARGET_ARCH_ABI), armeabi-v7a)
7+
ifeq ("$(shell test -e $(MY_LOCAL_PATH)/../build/.armv7 && echo armv7)","armv7")
8+
MY_ARMV7 := true
9+
endif
10+
ifeq ("$(shell test -e $(MY_LOCAL_PATH)/../build/.armv7neon && echo armv7neon)","armv7neon")
11+
MY_ARMV7_NEON := true
12+
endif
13+
endif
14+
ifeq ($(MY_ARMV7_NEON), true)
15+
FFMPEG_INCLUDES := $(MY_LOCAL_PATH)/../../prebuilt/android-$(TARGET_ARCH)/neon/ffmpeg/include
16+
$(call import-module, cpu-features/neon)
17+
else
18+
FFMPEG_INCLUDES := $(MY_LOCAL_PATH)/../../prebuilt/android-$(TARGET_ARCH)/ffmpeg/include
19+
$(call import-module, cpu-features)
20+
endif
421

522
MY_ARM_MODE := arm
623
MY_ARM_NEON := false
7-
LOCAL_PATH := app/src/main/cpp
24+
LOCAL_PATH := $(MY_LOCAL_PATH)/../app/src/main/cpp
825

926
# DEFINE ARCH FLAGS
1027
ifeq ($(TARGET_ARCH_ABI), armeabi-v7a)
1128
MY_ARCH_FLAGS := ARM_V7A
12-
MY_ARM_NEON := true
29+
MY_ARM_NEON := false
1330
endif
1431
ifeq ($(TARGET_ARCH_ABI), arm64-v8a)
1532
MY_ARCH_FLAGS := ARM64_V8A
@@ -27,30 +44,61 @@ LOCAL_ARM_MODE := $(MY_ARM_MODE)
2744
LOCAL_MODULE := mobileffmpeg_abidetect
2845
LOCAL_SRC_FILES := mobileffmpeg_abidetect.c
2946
LOCAL_CFLAGS := -Wall -Wextra -Werror -Wno-unused-parameter -DMOBILE_FFMPEG_${MY_ARCH_FLAGS}
30-
LOCAL_C_INCLUDES += $(FFMPEG_INCLUDES)
47+
LOCAL_C_INCLUDES := $(FFMPEG_INCLUDES)
3148
LOCAL_LDLIBS := -llog -lz -landroid
3249
LOCAL_STATIC_LIBRARIES := cpu-features
3350
LOCAL_ARM_NEON := ${MY_ARM_NEON}
3451
include $(BUILD_SHARED_LIBRARY)
3552

36-
include $(CLEAR_VARS)
37-
LOCAL_ARM_MODE := $(MY_ARM_MODE)
38-
LOCAL_MODULE := mobileffmpeg
3953
ifeq ($(TARGET_PLATFORM),android-16)
40-
LOCAL_SRC_FILES := mobileffmpeg.c mobileffprobe.c android_lts_support.c mobileffmpeg_exception.c fftools_cmdutils.c fftools_ffmpeg.c fftools_ffprobe.c fftools_ffmpeg_opt.c fftools_ffmpeg_hw.c fftools_ffmpeg_filter.c
54+
MY_SRC_FILES := mobileffmpeg.c mobileffprobe.c android_lts_support.c mobileffmpeg_exception.c fftools_cmdutils.c fftools_ffmpeg.c fftools_ffprobe.c fftools_ffmpeg_opt.c fftools_ffmpeg_hw.c fftools_ffmpeg_filter.c
4155
else ifeq ($(TARGET_PLATFORM),android-17)
42-
LOCAL_SRC_FILES := mobileffmpeg.c mobileffprobe.c android_lts_support.c mobileffmpeg_exception.c fftools_cmdutils.c fftools_ffmpeg.c fftools_ffprobe.c fftools_ffmpeg_opt.c fftools_ffmpeg_hw.c fftools_ffmpeg_filter.c
56+
MY_SRC_FILES := mobileffmpeg.c mobileffprobe.c android_lts_support.c mobileffmpeg_exception.c fftools_cmdutils.c fftools_ffmpeg.c fftools_ffprobe.c fftools_ffmpeg_opt.c fftools_ffmpeg_hw.c fftools_ffmpeg_filter.c
4357
else
44-
LOCAL_SRC_FILES := mobileffmpeg.c mobileffprobe.c mobileffmpeg_exception.c fftools_cmdutils.c fftools_ffmpeg.c fftools_ffprobe.c fftools_ffmpeg_opt.c fftools_ffmpeg_hw.c fftools_ffmpeg_filter.c
58+
MY_SRC_FILES := mobileffmpeg.c mobileffprobe.c mobileffmpeg_exception.c fftools_cmdutils.c fftools_ffmpeg.c fftools_ffprobe.c fftools_ffmpeg_opt.c fftools_ffmpeg_hw.c fftools_ffmpeg_filter.c
4559
endif
46-
LOCAL_CFLAGS := -Wall -Werror -Wno-unused-parameter -Wno-switch -Wno-sign-compare
47-
LOCAL_LDLIBS := -llog -lz -landroid
48-
LOCAL_SHARED_LIBRARIES := libavfilter libavformat libavcodec libavutil libswresample libavdevice libswscale
49-
ifeq ($(APP_STL),c++_shared)
50-
LOCAL_SHARED_LIBRARIES += c++_shared # otherwise NDK will not add the library for packaging
60+
61+
MY_CFLAGS := -Wall -Werror -Wno-unused-parameter -Wno-switch -Wno-sign-compare
62+
MY_LDLIBS := -llog -lz -landroid
63+
64+
MY_BUILD_GENERIC_MOBILE_FFMPEG := true
65+
66+
ifeq ($(MY_ARMV7_NEON), true)
67+
include $(CLEAR_VARS)
68+
LOCAL_PATH := $(MY_LOCAL_PATH)/../app/src/main/cpp
69+
LOCAL_ARM_MODE := $(MY_ARM_MODE)
70+
LOCAL_MODULE := mobileffmpeg_armv7a_neon
71+
LOCAL_SRC_FILES := $(MY_SRC_FILES)
72+
LOCAL_CFLAGS := $(MY_CFLAGS)
73+
LOCAL_LDLIBS := $(MY_LDLIBS)
74+
LOCAL_SHARED_LIBRARIES := libavcodec_neon libavfilter_neon libswscale_neon libavformat_neon libavutil_neon libswresample_neon libavdevice_neon
75+
ifeq ($(APP_STL), c++_shared)
76+
LOCAL_SHARED_LIBRARIES += c++_shared # otherwise NDK will not add the library for packaging
77+
endif
78+
LOCAL_ARM_NEON := true
79+
include $(BUILD_SHARED_LIBRARY)
80+
81+
$(call import-module, ffmpeg/neon)
82+
83+
ifneq ($(MY_ARMV7), true)
84+
MY_BUILD_GENERIC_MOBILE_FFMPEG := false
85+
endif
5186
endif
52-
LOCAL_ARM_NEON := ${MY_ARM_NEON}
53-
include $(BUILD_SHARED_LIBRARY)
5487

55-
$(call import-module, ffmpeg)
56-
$(call import-module, cpu-features)
88+
ifeq ($(MY_BUILD_GENERIC_MOBILE_FFMPEG), true)
89+
include $(CLEAR_VARS)
90+
LOCAL_PATH := $(MY_LOCAL_PATH)/../app/src/main/cpp
91+
LOCAL_ARM_MODE := $(MY_ARM_MODE)
92+
LOCAL_MODULE := mobileffmpeg
93+
LOCAL_SRC_FILES := $(MY_SRC_FILES)
94+
LOCAL_CFLAGS := $(MY_CFLAGS)
95+
LOCAL_LDLIBS := $(MY_LDLIBS)
96+
LOCAL_SHARED_LIBRARIES := libavfilter libavformat libavcodec libavutil libswresample libavdevice libswscale
97+
ifeq ($(APP_STL), c++_shared)
98+
LOCAL_SHARED_LIBRARIES += c++_shared # otherwise NDK will not add the library for packaging
99+
endif
100+
LOCAL_ARM_NEON := ${MY_ARM_NEON}
101+
include $(BUILD_SHARED_LIBRARY)
102+
103+
$(call import-module, ffmpeg)
104+
endif

Diff for: android/jni/cpu-features/neon/Android.mk

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
LOCAL_PATH := $(call my-dir)/../../../../prebuilt/android-$(TARGET_ARCH)/neon/cpu-features/lib
2+
3+
include $(CLEAR_VARS)
4+
LOCAL_ARM_MODE := $(MY_ARM_MODE)
5+
LOCAL_MODULE := cpu-features
6+
LOCAL_SRC_FILES := libndk_compat.a
7+
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../include/ndk_compat
8+
include $(PREBUILT_STATIC_LIBRARY)

Diff for: android/jni/ffmpeg/neon/Android.mk

+15-7
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,61 @@
11
LOCAL_PATH := $(call my-dir)/../../../../prebuilt/android-$(TARGET_ARCH)/neon/ffmpeg/lib
22

33
MY_ARM_MODE := arm
4+
MY_ARM_NEON := true
45

56
include $(CLEAR_VARS)
67
LOCAL_ARM_MODE := $(MY_ARM_MODE)
8+
LOCAL_ARM_NEON := ${MY_ARM_NEON}
79
LOCAL_MODULE := libavcodec_neon
810
LOCAL_MODULE_FILENAME := $(LOCAL_MODULE)
9-
LOCAL_SRC_FILES := libavcodec.so
11+
LOCAL_SRC_FILES := libavcodec_neon.so
1012
include $(PREBUILT_SHARED_LIBRARY)
1113

1214
include $(CLEAR_VARS)
1315
LOCAL_ARM_MODE := $(MY_ARM_MODE)
16+
LOCAL_ARM_NEON := ${MY_ARM_NEON}
1417
LOCAL_MODULE := libavfilter_neon
1518
LOCAL_MODULE_FILENAME := $(LOCAL_MODULE)
16-
LOCAL_SRC_FILES := libavfilter.so
19+
LOCAL_SRC_FILES := libavfilter_neon.so
1720
include $(PREBUILT_SHARED_LIBRARY)
1821

1922
include $(CLEAR_VARS)
2023
LOCAL_ARM_MODE := $(MY_ARM_MODE)
24+
LOCAL_ARM_NEON := ${MY_ARM_NEON}
2125
LOCAL_MODULE := libavdevice_neon
2226
LOCAL_MODULE_FILENAME := $(LOCAL_MODULE)
23-
LOCAL_SRC_FILES := libavdevice.so
27+
LOCAL_SRC_FILES := libavdevice_neon.so
2428
include $(PREBUILT_SHARED_LIBRARY)
2529

2630
include $(CLEAR_VARS)
2731
LOCAL_ARM_MODE := $(MY_ARM_MODE)
32+
LOCAL_ARM_NEON := ${MY_ARM_NEON}
2833
LOCAL_MODULE := libavformat_neon
2934
LOCAL_MODULE_FILENAME := $(LOCAL_MODULE)
30-
LOCAL_SRC_FILES := libavformat.so
35+
LOCAL_SRC_FILES := libavformat_neon.so
3136
include $(PREBUILT_SHARED_LIBRARY)
3237

3338
include $(CLEAR_VARS)
3439
LOCAL_ARM_MODE := $(MY_ARM_MODE)
40+
LOCAL_ARM_NEON := ${MY_ARM_NEON}
3541
LOCAL_MODULE := libavutil_neon
3642
LOCAL_MODULE_FILENAME := $(LOCAL_MODULE)
37-
LOCAL_SRC_FILES := libavutil.so
43+
LOCAL_SRC_FILES := libavutil_neon.so
3844
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../include
3945
include $(PREBUILT_SHARED_LIBRARY)
4046

4147
include $(CLEAR_VARS)
4248
LOCAL_ARM_MODE := $(MY_ARM_MODE)
49+
LOCAL_ARM_NEON := ${MY_ARM_NEON}
4350
LOCAL_MODULE := libswresample_neon
4451
LOCAL_MODULE_FILENAME := $(LOCAL_MODULE)
45-
LOCAL_SRC_FILES := libswresample.so
52+
LOCAL_SRC_FILES := libswresample_neon.so
4653
include $(PREBUILT_SHARED_LIBRARY)
4754

4855
include $(CLEAR_VARS)
4956
LOCAL_ARM_MODE := $(MY_ARM_MODE)
57+
LOCAL_ARM_NEON := ${MY_ARM_NEON}
5058
LOCAL_MODULE := libswscale_neon
5159
LOCAL_MODULE_FILENAME := $(LOCAL_MODULE)
52-
LOCAL_SRC_FILES := libswscale.so
60+
LOCAL_SRC_FILES := libswscale_neon.so
5361
include $(PREBUILT_SHARED_LIBRARY)

Diff for: build/android-common.sh

+1-5
Original file line numberDiff line numberDiff line change
@@ -141,11 +141,7 @@ get_target_build() {
141141
echo "arm"
142142
;;
143143
arm-v7a-neon)
144-
if [[ ! -z ${MOBILE_FFMPEG_LTS_BUILD} ]]; then
145-
echo "arm/neon"
146-
else
147-
echo "arm"
148-
fi
144+
echo "arm/neon"
149145
;;
150146
arm64-v8a)
151147
echo "arm64"

0 commit comments

Comments
 (0)