Mac OS下为Android Studio编译FFmpeg解码库的详细教程

2019-12-10 19:27:05丽君

A>添加这一段以禁用自动ndk-build。

sourceSets.main.jni.srcDirs = []

B>添加这一段让它知道用库

  ndk {
   abiFilter "armeabi"
   moduleName "ovsplayer"
   ldLibs "log", "z", "m", "jnigraphics", "android"
  }

修改后的build.gradle是这样的。

android {
 compileSdkVersion 21
 buildToolsVersion "21.1.1"
 
 sourceSets.main.jni.srcDirs = [] // 禁用自动执行ndk-build
 defaultConfig {
  applicationId "com.example.chengang.myapplication"
  minSdkVersion 15
  targetSdkVersion 21
  versionCode 1
  versionName "1.0"
  ndk {
   abiFilter "armeabi"
   moduleName "ovsplayer" // 这个是C文件的名字
   ldLibs "log", "z", "m", "jnigraphics", "android"
  }
 }
 buildTypes {
  release {
   minifyEnabled false
   proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  }
 }
}

3、生成头文件
执行命令,注意路径要根据自己的情况更改。

 

复制代码

 

javah -d jni -classpath ....buildintermediatesclassesdebug com.example.nativeapp.app.MainActivity

 


会生成这个文件$ROOT_DIR/app/src/main/jni/com_example_chengang_myapplication_MainActivity.h

 

4、编写C文件
$ROOT_DIR/app/src/main/jni/ovsplayer.c内容如下:


 

#include <stdio.h>
#include <stdlib.h>
 
#include "com_example_chengang_myapplication_MainActivity.h"
#include "libavutil/avutil.h"
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
 
 
JNIEXPORT jstring JNICALL Java_com_example_chengang_myapplication_MainActivity_getStringFromNative
 (JNIEnv * env , jobject obj)
 {
  const char *url = "/mnt/sdcard/1.mp4";
  av_register_all();
 
  AVFormatContext *pFormatCtx = NULL;
  int ret = avformat_open_input(&pFormatCtx, url, NULL, NULL);
 
  ret = avformat_find_stream_info(input_context, NULL);
  int streamNum = input_context->nb_streams;
 
  char wd[512];
  sprintf(wd, "AVCODEC VERSION %un, streamNum[%d]"
    , avcodec_version()
    , streamNum
    );
  return (*env)->NewStringUTF(env, wd);
 }