0
点赞
收藏
分享

微信扫一扫

Mac上android ijkplayer本地编译加调试

gy2006_sw 2022-01-05 阅读 97

1.本地编译

设置环境变量,ndk要用版本r10e

ANDROID_SDK
ANDROID_NDK

系统偏好设置->安全性与隐私->通用->允许从一下位置下载的app设置为任何来源
设置方法:打开了 Terminal 终端后 ,在命令提示后输入 

sudo spctl --master-disable
之后按照官方提示操作就行  

2.本地调试 

ijkplayer-armv7a工程关联Android.mk编译脚本

修改文件:ijkplayer/ijkplayer-armv7a/build.gradle
修改内容:不要指定jni的lib库文件夹位置

android {
    //删除以下内容
    //sourceSets.main {
    //  jniLibs.srcDirs 'src/main/libs'
    //  jni.srcDirs = [] // This prevents the auto generation of Android.mk
    //}
}

修改内容:添加native代码主编译脚本Android.mk的文件路径

android {
    //添加以下内容
    externalNativeBuild {
        ndkBuild {
            path "src/main/jni/Android.mk"
        }
    }
}

修改内容:设置编译脚本的参数

android {
    defaultConfig {
        //添加以下内容
        externalNativeBuild {
            ndkBuild {
                arguments "NDK_APPLICATION:=src/main/jni/Application.mk"
                abiFilters "armeabi-v7a"
            }
        }
    }
}

修改内容:开启工程的debug模式

android {
    buildTypes {
        //添加以下内容
        debug {
            debuggable true
            jniDebuggable true
            ndk {
                debuggable true
            }
        }
    }
}

修改ffmpeg的编译脚本

修改文件:ijkplayer/ijkplayer-armv7a/src/main/jni/ffmpeg/Android.mk
修改内容:将ffmpeg的链接方式由动态库方式改为静态库方式

LOCAL_PATH := $(call my-dir)

#删除ffmpeg动态库相关
#include $(CLEAR_VARS)
#LOCAL_MODULE := ijkffmpeg
#LOCAL_SRC_FILES := #$(MY_APP_FFMPEG_OUTPUT_PATH)/libijkffmpeg.so
#Include $(PREBUILT_SHARED_LIBRARY)

#添加ffmpeg静态库相关如下全部
include $(CLEAR_VARS)
LOCAL_MODULE    := avcodec
LOCAL_SRC_FILES := $(MY_APP_FFMPEG_OUTPUT_PATH)/lib/libavcodec.a
LOCAL_EXPORT_C_INCLUDES := $(MY_APP_FFMPEG_INCLUDE_PATH)
LOCAL_C_INCLUDES += $(MY_APP_FFMPEG_INCLUDE_PATH)
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := avformat
LOCAL_SRC_FILES := $(MY_APP_FFMPEG_OUTPUT_PATH)/lib/libavformat.a
LOCAL_EXPORT_C_INCLUDES := $(MY_APP_FFMPEG_INCLUDE_PATH)
LOCAL_C_INCLUDES += $(MY_APP_FFMPEG_INCLUDE_PATH)
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := swscale
LOCAL_SRC_FILES := $(MY_APP_FFMPEG_OUTPUT_PATH)/lib/libswscale.a
LOCAL_EXPORT_C_INCLUDES := $(MY_APP_FFMPEG_OUTPUT_PATH)/include
LOCAL_C_INCLUDES += $(MY_APP_FFMPEG_INCLUDE_PATH)
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := avutil
LOCAL_SRC_FILES := $(MY_APP_FFMPEG_OUTPUT_PATH)/lib/libavutil.a
LOCAL_EXPORT_C_INCLUDES := $(MY_APP_FFMPEG_INCLUDE_PATH)
LOCAL_C_INCLUDES += $(MY_APP_FFMPEG_INCLUDE_PATH)
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := avfilter
LOCAL_SRC_FILES := $(MY_APP_FFMPEG_OUTPUT_PATH)/lib/libavfilter.a
LOCAL_EXPORT_C_INCLUDES := $(MY_APP_FFMPEG_INCLUDE_PATH)
LOCAL_C_INCLUDES += $(MY_APP_FFMPEG_INCLUDE_PATH)
include $(PREBUILT_STATIC_LIBRARY)

LOCAL_MODULE    := swresample
LOCAL_SRC_FILES := $(MY_APP_FFMPEG_OUTPUT_PATH)/lib/libswresample.a
LOCAL_EXPORT_C_INCLUDES := $(MY_APP_FFMPEG_INCLUDE_PATH)
LOCAL_C_INCLUDES += $(MY_APP_FFMPEG_INCLUDE_PATH)
include $(PREBUILT_STATIC_LIBRARY)

修改ijkplayer的编译脚本

修改文件:ijkplayer/ijkmedia/ijkplayer/Android.mk
修改内容:添加两个本地库-lm -lz

LOCAL_CFLAGS += -std=c99
#LOCAL_LDLIBS += -llog -landroid
LOCAL_LDLIBS += -llog -landroid -lm -lz

修改内容:将ffmpeg由动态链接方式改为静态链接方式

#LOCAL_SHARED_LIBRARIES := ijkffmpeg ijksdl
#LOCAL_STATIC_LIBRARIES := android-ndk-profiler ijksoundtouch
LOCAL_SHARED_LIBRARIES := ijksdl
LOCAL_STATIC_LIBRARIES := android-ndk-profiler ijksoundtouch avformat avcodec swscale swresample avfilter avutil

修改ijksdl编译脚本

修改文件:ijkplayer/ijkmedia/ijksdl/Android.mk
修改内容:将ffmpeg由动态链接方式改为静态链接方式

#LOCAL_SHARED_LIBRARIES := ijkffmpeg
#LOCAL_STATIC_LIBRARIES := cpufeatures yuv_static ijkj4a
LOCAL_STATIC_LIBRARIES := cpufeatures yuv_static ijkj4a avformat avcodec swscale swresample avfilter avutil

屏蔽掉java层对于ffmpeg动态库的加载

修改文件:ijkplayer/ijkplayer-java/src/main/java/tv/danmaku/ijk/media/player/IjkMediaPlayer.java
修改内容:由于ffmpeg采用了静态库导入,所以这里并不需要加载ffmpeg的动态库。

public static void loadLibrariesOnce(IjkLibLoader libLoader) {
    synchronized (IjkMediaPlayer.class) {
        if (!mIsLibLoaded) {
            if (libLoader == null)
                libLoader = sLocalLibLoader;
            //这里屏蔽掉ijkffmpeg库的加载
            //libLoader.loadLibrary("ijkffmpeg");
            libLoader.loadLibrary("ijksdl");
            libLoader.loadLibrary("ijkplayer");
            mIsLibLoaded = true;
        }
    }
}

example工程同步修改

修改文件:ijkplayer/ijkplayer-example/build.gradle
修改内容:将cpu的类型指定为armv7a,并且开启debug模式

android {
    //指定armeabi-v7a
    defaultConfig {
        externalNativeBuild {
            ndkBuild {
                abiFilters "armeabi-v7a"
            }
        }
    }
    buildTypes {
        //添加debug模式的指定
        debug {
            jniDebuggable true
        }
    }
}

修改内容:删除掉非armeabi-v7a工程的依赖

dependencies {
    //all32Compile project(':ijkplayer-armv5')
    all32Compile project(':ijkplayer-armv7a')
    //all32Compile project(':ijkplayer-x86')

    //all64Compile project(':ijkplayer-armv5')
    all64Compile project(':ijkplayer-armv7a')
    //all64Compile project(':ijkplayer-arm64')
    //all64Compile project(':ijkplayer-x86')
    //all64Compile project(':ijkplayer-x86_64')
}

ndk库的关联

修改文件:ijkplayer/local.properties
修改内容:ijkplayer由于需要依赖ndk进行编译,所以我们要指定本机的ndk目录地址,并且确保这个ndk版本必须在r12到r14之间的版本,千万不要用到sdk里面的那个ndk。

ndk.dir=<你的ndk路径>

关闭编译优化方便调试

修改文件:ijkplayer/ijkplayer-armv7a/src/main/jni/Application.mk
修改内容:c代码在编译的时候可能过度优化导致调试的时候看不到变量的值,我们可以将-O3的优化级别改为-O0

APP_CFLAGS := 
    #将O3的优化级别降低为O0
    #-O3 -Wall -pipe \
     -O0 -Wall -pipe \
    -ffast-math \
    -fstrict-aliasing -Werror=strict-aliasing \
    -Wno-psabi -Wa,--noexecstack \
    -DANDROID -DNDEBUG

可能会遇到的错误

如果发现这个报错

All flavors must now belong to a named flavor dimension. Learn more at https://d.android.com/r/tools/flavorDimensions-missing-error-message.html

ijkplayer/ijkplayer-example/build.gradle中添加

android {
  defaultConfig {
    #这个值需要与工程下的ijkplayer/build.gradle中的versionCode相同
    flavorDimensions "800800"
  }
}

以上的配置就完成了,但是还不能断点调试
 

Run -> Edit Configurations -> Debugger -> Symbol Directories
#     Add "ijkplayer-armv7a/" to Symbol Directories

 

我遇到的问题:
使用高版本的gradle,c++代码可以点击跟踪,但是debug挂不上
使用4.6版本的gradle,c++代码不可以点击跟踪,但是可以debug调试
试了好多次,使用 5.4.1-bin 版本解决了问题
 

如果打包时apk中没有lib目录
 

 

 

举报

相关推荐

0 条评论