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);
}










