乐趣区

关于android:ijkplayer升级ndk版本

因为打算近期打算重构 ijkplayer 的安卓局部代码 思考对于安卓硬解码局部反对 c ++ 版本须要最低 21 的版本, 而 ijkplayer 仅反对 16 的版本, 所以特记录在 ndk 的降级过程中须要批改的一些中央。

修改 android/contrib/tools/do-detect-env.sh

IJK_NDK_REL=$(grep -o '^Pkg\.Revision.*=[0-9]*.*' $ANDROID_NDK/source.properties 2>/dev/null | sed 's/[[:space:]]*//g' | cut -d "=" -f 2)
echo "IJK_NDK_REL=$IJK_NDK_REL"
case "$IJK_NDK_REL" in
-    11*|12*|13*|14*|15*|16*)
+    11*|12*|13*|14*|15*|16*|21*)
if test -d ${ANDROID_NDK}/toolchains/arm-linux-androideabi-4.9
then
echo "NDKr$IJK_NDK_REL detected"

在上述代码中 增加 21 的版本反对

修改 android/ijkplayer/build.gradle

buildToolsVersion = "30.0.3"
targetSdkVersion = 30

- ndkVersion = "16.1.4479499"
+ ndkVersion = "21.1.6352462"

versionCode = property("VERSION_CODE").toInteger()
versionName = property("VERSION_NAME")

将 ndkVersion 版本晋升至 21

批改 extra/CMakeLists.txt.yuv

if(ANDROID)
  if(${ANDROID_ABI} STREQUAL "armeabi-va7")
-    add_definitions(-DLIBYUV_NEON)
+    add_definitions(-LIBYUV_NEON)
    list(APPEND ly_source_files
      source/compare_neon.cc.neon
      source/rotate_neon.cc.neon
      source/row_neon.cc.neon
      source/scale_neon.cc.neon
    )
  elseif(${ANDROID_ABI} STREQUAL "arm64-v8a")
-    add_definitions(-DLIBYUV_NEON)
+    add_definitions(-LIBYUV_NEON)
    list(APPEND ly_source_files
      source/compare_neon64.cc
      source/rotate_neon64.cc

减少 android/ijkplayer/fijkplayer-full/gradle.properties

POM_ARTIFACT_ID=fijkplayer-full
POM_PACKAGING=aar
IJK_CXX_STL=c++_static
+ APP_STL=c++_static

批改 android/ijkplayer/ijkplayer-armv5/src/main/jni/Application.mk

APP_OPTIM := release
- APP_PLATFORM := android-9
+ APP_PLATFORM := android-16
APP_ABI := armeabi
NDK_TOOLCHAIN_VERSION=4.9
APP_PIE := false

- APP_STL := stlport_static
+ APP_STL := c++_static

APP_CFLAGS := -O3 -Wall -pipe \
    -ffast-math \

批改 android/ijkplayer/ijkplayer-armv5/build.gradle

    buildToolsVersion rootProject.ext.buildToolsVersion

    defaultConfig {
 -       minSdkVersion 9
 +       minSdkVersion 16
        targetSdkVersion rootProject.ext.targetSdkVersion
    }
    buildTypes {

注: 这里仅仅是列举了 armv5 其余的平台的也须要批改

批改 extra/CMakeLists.txt.yuv 的一些依赖

set(ly_source_files
  ${ly_src_dir}/compare.cc
  ${ly_src_dir}/compare_common.cc
  - # ${ly_src_dir}/compare_neon.cc
  + ${ly_src_dir}/compare_neon.cc
  ${ly_src_dir}/compare_posix.cc
  - # ${ly_src_dir}/compare_win.cc
  + ${ly_src_dir}/compare_win.cc
  ${ly_src_dir}/convert.cc
  ${ly_src_dir}/convert_argb.cc
  ${ly_src_dir}/convert_from.cc
  ${ly_src_dir}/convert_from_argb.cc
  - # ${ly_src_dir}/convert_jpeg.cc
  + ${ly_src_dir}/convert_jpeg.cc
  ${ly_src_dir}/convert_to_argb.cc
  ${ly_src_dir}/convert_to_i420.cc
  ${ly_src_dir}/cpu_id.cc
  ${ly_src_dir}/format_conversion.cc
  - # ${ly_src_dir}/mjpeg_decoder.cc
  - # ${ly_src_dir}/mjpeg_validate.cc
  + ${ly_src_dir}/mjpeg_decoder.cc
  + ${ly_src_dir}/mjpeg_validate.cc
  ${ly_src_dir}/planar_functions.cc
  ${ly_src_dir}/rotate.cc
  ${ly_src_dir}/rotate_argb.cc
  ${ly_src_dir}/rotate_mips.cc
  - # ${ly_src_dir}/rotate_neon.cc
  + ${ly_src_dir}/rotate_neon.cc
  ${ly_src_dir}/row_any.cc
  ${ly_src_dir}/row_common.cc
  ${ly_src_dir}/row_mips.cc
  - # ${ly_src_dir}/row_neon.cc
  + ${ly_src_dir}/row_neon.cc
  ${ly_src_dir}/row_posix.cc
  - # ${ly_src_dir}/row_win.cc
  + ${ly_src_dir}/row_win.cc
  ${ly_src_dir}/scale.cc
  ${ly_src_dir}/scale_argb.cc
  ${ly_src_dir}/scale_common.cc
  ${ly_src_dir}/scale_mips.cc
  - # ${ly_src_dir}/scale_neon.cc
  + ${ly_src_dir}/scale_neon.cc
  ${ly_src_dir}/scale_posix.cc
  - # ${ly_src_dir}/scale_win.cc
  + ${ly_src_dir}/scale_win.cc
  ${ly_src_dir}/video_common.cc
)

通过上述的革新后 即可应用 21 的 NDK 版本进行编译 或者能够间接应用 https://github.com/FlutterPlayer/ijkplayer 仓库的代码间接编译 对于 ijkplayer 的 android 编译能够参考这篇文章 https://fplayer.dev/core/build-android.html

退出移动版