Skip to content

Commit 891935b

Browse files
committed
jni部分
1 parent 771ee38 commit 891935b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

122 files changed

+29417
-0
lines changed

app/jnicode/jni/Android.mk

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
LOCAL_PATH := $(call my-dir)
2+
3+
include $(CLEAR_VARS)
4+
LOCAL_MODULE := libavutil
5+
LOCAL_SRC_FILES := prebuilt/libavutil.so
6+
include $(PREBUILT_SHARED_LIBRARY)
7+
8+
include $(CLEAR_VARS)
9+
LOCAL_MODULE := libswresample
10+
LOCAL_SRC_FILES := prebuilt/libswresample.so
11+
include $(PREBUILT_SHARED_LIBRARY)
12+
13+
include $(CLEAR_VARS)
14+
LOCAL_MODULE := libswscale
15+
LOCAL_SRC_FILES := prebuilt/libswscale.so
16+
include $(PREBUILT_SHARED_LIBRARY)
17+
18+
include $(CLEAR_VARS)
19+
LOCAL_MODULE := libavcodec
20+
LOCAL_SRC_FILES := prebuilt/libavcodec.so
21+
include $(PREBUILT_SHARED_LIBRARY)
22+
23+
24+
include $(CLEAR_VARS)
25+
LOCAL_MODULE := libavformat
26+
LOCAL_SRC_FILES := prebuilt/libavformat.so
27+
include $(PREBUILT_SHARED_LIBRARY)
28+
29+
include $(CLEAR_VARS)
30+
LOCAL_MODULE := libavfilter
31+
LOCAL_SRC_FILES := prebuilt/libavfilter.so
32+
include $(PREBUILT_SHARED_LIBRARY)
33+
34+
include $(CLEAR_VARS)
35+
LOCAL_MODULE := libavdevice
36+
LOCAL_SRC_FILES := prebuilt/libavdevice.so
37+
include $(PREBUILT_SHARED_LIBRARY)
38+
39+
include $(CLEAR_VARS)
40+
LOCAL_MODULE := libpostproc
41+
LOCAL_SRC_FILES := prebuilt/libpostproc.so
42+
include $(PREBUILT_SHARED_LIBRARY)
43+
44+
45+
include $(CLEAR_VARS)
46+
47+
LOCAL_ARM_MODE := arm
48+
LOCAL_MODULE := ffmpeg
49+
50+
51+
LOCAL_SRC_FILES := Jni_FFmpegCmd.c\
52+
cmdutils.c \
53+
ffmpeg.c \
54+
ffmpeg_opt.c \
55+
ffmpeg_filter.c \
56+
ffmpeg_thread.c
57+
58+
LOCAL_C_INCLUDES := E:\ijkPlayer\EpMedia\ffmpeg-3.3.4
59+
60+
LOCAL_LDLIBS := -llog -ljnigraphics -lz -landroid -lm -pthread -L$(SYSROOT)/usr/lib -latomic
61+
LOCAL_SHARED_LIBRARIES := libavcodec libavfilter libavformat libavutil libswresample libswscale libavdevice libpostproc
62+
LOCAL_CFLAGS := -D__STDC_CONSTANT_MACROS -Wno-sign-compare -Wno-switch -Wno-pointer-sign -DHAVE_NEON=1 -fPIC -DANDROI
63+
64+
include $(BUILD_SHARED_LIBRARY)

app/jnicode/jni/Application.mk

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
APP_ABI := armeabi armeabi-v7a
2+
APP_PLATFORM=android-19

app/jnicode/jni/Jni_FFmpegCmd.c

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
#include "Jni_FFmpegCmd.h"
2+
#include <string.h>
3+
#include "ffmpeg_thread.h"
4+
#include "android_log.h"
5+
#include "cmdutils.h"
6+
7+
static JavaVM *jvm = NULL;
8+
//java虚拟机
9+
static jclass m_clazz = NULL;//当前类(面向java)
10+
11+
/**
12+
* 回调执行Java方法
13+
* 参看 Jni反射+Java反射
14+
*/
15+
void callJavaMethod(JNIEnv *env, jclass clazz,int ret) {
16+
if (clazz == NULL) {
17+
LOGE("---------------clazz isNULL---------------");
18+
return;
19+
}
20+
//获取方法ID (I)V指的是方法签名 通过javap -s -public FFmpegCmd 命令生成
21+
jmethodID methodID = (*env)->GetStaticMethodID(env, clazz, "onExecuted", "(I)V");
22+
if (methodID == NULL) {
23+
LOGE("---------------methodID isNULL---------------");
24+
return;
25+
}
26+
//调用该java方法
27+
(*env)->CallStaticVoidMethod(env, clazz, methodID,ret);
28+
}
29+
void callJavaMethodProgress(JNIEnv *env, jclass clazz,float ret) {
30+
if (clazz == NULL) {
31+
LOGE("---------------clazz isNULL---------------");
32+
return;
33+
}
34+
//获取方法ID (I)V指的是方法签名 通过javap -s -public FFmpegCmd 命令生成
35+
jmethodID methodID = (*env)->GetStaticMethodID(env, clazz, "onProgress", "(F)V");
36+
if (methodID == NULL) {
37+
LOGE("---------------methodID isNULL---------------");
38+
return;
39+
}
40+
//调用该java方法
41+
(*env)->CallStaticVoidMethod(env, clazz, methodID,ret);
42+
}
43+
44+
/**
45+
* c语言-线程回调
46+
*/
47+
static void ffmpeg_callback(int ret) {
48+
JNIEnv *env;
49+
//附加到当前线程从JVM中取出JNIEnv, C/C++从子线程中直接回到Java里的方法时 必须经过这个步骤
50+
(*jvm)->AttachCurrentThread(jvm, (void **) &env, NULL);
51+
callJavaMethod(env, m_clazz,ret);
52+
53+
//完毕-脱离当前线程
54+
(*jvm)->DetachCurrentThread(jvm);
55+
}
56+
57+
void ffmpeg_progress(float progress) {
58+
JNIEnv *env;
59+
(*jvm)->AttachCurrentThread(jvm, (void **) &env, NULL);
60+
callJavaMethodProgress(env, m_clazz,progress);
61+
(*jvm)->DetachCurrentThread(jvm);
62+
}
63+
64+
/*
65+
* Class: JniTest_FFmpegCmd
66+
* Method: exec
67+
* Signature: (I[Ljava/lang/String;)I
68+
*/
69+
JNIEXPORT jint
70+
71+
JNICALL Java_Jni_FFmpegCmd_exec
72+
(JNIEnv *env, jclass clazz, jint cmdnum, jobjectArray cmdline) {
73+
//---------------------------------C语言 反射Java 相关----------------------------------------
74+
//在jni的c线程中不允许使用共用的env环境变量 但JavaVM在整个jvm中是共用的 可通过保存JavaVM指针,到时候再通过JavaVM指针取出JNIEnv *env;
75+
//ICS之前(你可把NDK sdk版本改成低于11) 可以直接写m_clazz = clazz;直接赋值, 然而ICS(sdk11) 后便改变了这一机制,在线程中回调java时 不能直接共用变量 必须使用NewGlobalRef创建全局对象
76+
//官方文档正在拼命的解释这一原因,参看:http://android-developers.blogspot.jp/2011/11/jni-local-reference-changes-in-ics.html
77+
(*env)->GetJavaVM(env, &jvm);
78+
m_clazz = (*env)->NewGlobalRef(env, clazz);
79+
//---------------------------------C语言 反射Java 相关----------------------------------------
80+
//---------------------------------java 数组转C语言数组----------------------------------------
81+
int i = 0;//满足NDK所需的C99标准
82+
char **argv = NULL;//命令集 二维指针
83+
jstring *strr = NULL;
84+
85+
if (cmdline != NULL) {
86+
argv = (char **) malloc(sizeof(char *) * cmdnum);
87+
strr = (jstring *) malloc(sizeof(jstring) * cmdnum);
88+
89+
for (i = 0; i < cmdnum; ++i) {//转换
90+
strr[i] = (jstring)(*env)->GetObjectArrayElement(env, cmdline, i);
91+
argv[i] = (char *) (*env)->GetStringUTFChars(env, strr[i], 0);
92+
}
93+
94+
}
95+
//---------------------------------java 数组转C语言数组----------------------------------------
96+
//---------------------------------执行FFmpeg命令相关----------------------------------------
97+
//新建线程 执行ffmpeg 命令
98+
ffmpeg_thread_run_cmd(cmdnum, argv);
99+
//注册ffmpeg命令执行完毕时的回调
100+
ffmpeg_thread_callback(ffmpeg_callback);
101+
102+
free(strr);
103+
return 0;
104+
}
105+
106+
JNIEXPORT void
107+
108+
/*
109+
JNICALL Java_Jni_FFmpegCmd_exit
110+
(JNIEnv *env, jclass clazz) {
111+
(*env)->GetJavaVM(env, &jvm);
112+
m_clazz = (*env)->NewGlobalRef(env, clazz);
113+
ffmpeg_thread_cancel();
114+
}
115+
*/

app/jnicode/jni/Jni_FFmpegCmd.h

Lines changed: 26 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/jnicode/jni/android_log.h

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
//#include <android/log.h>
2+
//#define LOGE(format, ...) __android_log_print(ANDROID_LOG_ERROR, "ffmpeg_vdtest", format, ##__VA_ARGS__)
3+
//#define LOGI(format, ...) __android_log_print(ANDROID_LOG_INFO, "ffmpeg_vdtest", format, ##__VA_ARGS__)
4+
#include <android/log.h>
5+
static int use_log_report = 0;
6+
7+
8+
#define FF_LOG_TAG "FFmpeg_EpMedia"
9+
10+
11+
#define FF_LOG_UNKNOWN ANDROID_LOG_UNKNOWN
12+
#define FF_LOG_DEFAULT ANDROID_LOG_DEFAULT
13+
14+
15+
#define FF_LOG_VERBOSE ANDROID_LOG_VERBOSE
16+
#define FF_LOG_DEBUG ANDROID_LOG_DEBUG
17+
#define FF_LOG_INFO ANDROID_LOG_INFO
18+
#define FF_LOG_WARN ANDROID_LOG_WARN
19+
#define FF_LOG_ERROR ANDROID_LOG_ERROR
20+
#define FF_LOG_FATAL ANDROID_LOG_FATAL
21+
#define FF_LOG_SILENT ANDROID_LOG_SILENT
22+
23+
24+
#define VLOG(level, TAG, ...) ((void)__android_log_vprint(level, TAG, __VA_ARGS__))
25+
#define VLOGV(...) VLOG(FF_LOG_VERBOSE, FF_LOG_TAG, __VA_ARGS__)
26+
#define VLOGD(...) VLOG(FF_LOG_DEBUG, FF_LOG_TAG, __VA_ARGS__)
27+
#define VLOGI(...) VLOG(FF_LOG_INFO, FF_LOG_TAG, __VA_ARGS__)
28+
#define VLOGW(...) VLOG(FF_LOG_WARN, FF_LOG_TAG, __VA_ARGS__)
29+
#define VLOGE(...) VLOG(FF_LOG_ERROR, FF_LOG_TAG, __VA_ARGS__)
30+
31+
32+
#define ALOG(level, TAG, ...) ((void)__android_log_print(level, TAG, __VA_ARGS__))
33+
#define ALOGV(...) ALOG(FF_LOG_VERBOSE, FF_LOG_TAG, __VA_ARGS__)
34+
#define ALOGD(...) ALOG(FF_LOG_DEBUG, FF_LOG_TAG, __VA_ARGS__)
35+
#define ALOGI(...) ALOG(FF_LOG_INFO, FF_LOG_TAG, __VA_ARGS__)
36+
#define ALOGW(...) ALOG(FF_LOG_WARN, FF_LOG_TAG, __VA_ARGS__)
37+
#define ALOGE(...) ALOG(FF_LOG_ERROR, FF_LOG_TAG, __VA_ARGS__)
38+
39+
#define LOGE(format, ...) __android_log_print(ANDROID_LOG_ERROR, FF_LOG_TAG, format, ##__VA_ARGS__)
40+
#define LOGI(format, ...) __android_log_print(ANDROID_LOG_INFO, FF_LOG_TAG, format, ##__VA_ARGS__)
41+
42+
43+
/*belown printf info*/
44+
static void ffp_log_callback_brief(void *ptr, int level, const char *fmt, va_list vl)
45+
{
46+
int ffplv = FF_LOG_VERBOSE;
47+
if (level <= AV_LOG_ERROR)
48+
ffplv = FF_LOG_ERROR;
49+
else if (level <= AV_LOG_WARNING)
50+
ffplv = FF_LOG_WARN;
51+
else if (level <= AV_LOG_INFO)
52+
ffplv = FF_LOG_INFO;
53+
else if (level <= AV_LOG_VERBOSE)
54+
ffplv = FF_LOG_VERBOSE;
55+
else
56+
ffplv = FF_LOG_DEBUG;
57+
58+
59+
if (level <= AV_LOG_INFO)
60+
VLOG(ffplv, FF_LOG_TAG, fmt, vl);
61+
}
62+
63+
64+
static void ffp_log_callback_report(void *ptr, int level, const char *fmt, va_list vl)
65+
{
66+
int ffplv = FF_LOG_VERBOSE;
67+
if (level <= AV_LOG_ERROR)
68+
ffplv = FF_LOG_ERROR;
69+
else if (level <= AV_LOG_WARNING)
70+
ffplv = FF_LOG_WARN;
71+
else if (level <= AV_LOG_INFO)
72+
ffplv = FF_LOG_INFO;
73+
else if (level <= AV_LOG_VERBOSE)
74+
ffplv = FF_LOG_VERBOSE;
75+
else
76+
ffplv = FF_LOG_DEBUG;
77+
78+
79+
va_list vl2;
80+
char line[1024];
81+
static int print_prefix = 1;
82+
83+
84+
va_copy(vl2, vl);
85+
// av_log_default_callback(ptr, level, fmt, vl);
86+
av_log_format_line(ptr, level, fmt, vl2, line, sizeof(line), &print_prefix);
87+
va_end(vl2);
88+
89+
90+
ALOG(ffplv, FF_LOG_TAG, "%s", line);
91+
}
92+

app/jnicode/jni/ffmpeg_thread.c

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
#include "libavcodec/avcodec.h"
2+
#include "ffmpeg_thread.h"
3+
#include "android_log.h"
4+
5+
pthread_t ntid;
6+
char **argvs = NULL;
7+
int num=0;
8+
9+
10+
void *thread(void *arg)
11+
{ //执行
12+
int result = ffmpeg_exec(num, argvs);
13+
return ((void *)0);
14+
}
15+
/**
16+
* 新建子线程执行ffmpeg命令
17+
*/
18+
int ffmpeg_thread_run_cmd(int cmdnum,char **argv){
19+
num=cmdnum;
20+
argvs=argv;
21+
22+
int temp =pthread_create(&ntid,NULL,thread,NULL);
23+
if(temp!=0)
24+
{
25+
LOGE("can't create thread: %s ",strerror(temp));
26+
return 1;
27+
}
28+
LOGI("create thread succes: %s ",strerror(temp));
29+
return 0;
30+
}
31+
32+
static void (*ffmpeg_callback)(int ret);
33+
/**
34+
* 注册线程回调
35+
*/
36+
void ffmpeg_thread_callback(void (*cb)(int ret)){
37+
ffmpeg_callback = cb;
38+
}
39+
40+
/**
41+
* 退出线程
42+
*/
43+
void ffmpeg_thread_exit(int ret){
44+
if (ffmpeg_callback) {
45+
ffmpeg_callback(ret);
46+
}
47+
pthread_exit("ffmpeg_thread_exit");
48+
}
49+
50+
/**
51+
* 取消线程
52+
*/
53+
void ffmpeg_thread_cancel(){
54+
void *ret=NULL;
55+
pthread_join(ntid, &ret);
56+
}

app/jnicode/jni/ffmpeg_thread.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#include "libavcodec/avcodec.h"
2+
#include "libavformat/avformat.h"
3+
#include "libswscale/swscale.h"
4+
#include "ffmpeg.h"
5+
#include <pthread.h>
6+
#include <string.h>
7+
8+
int ffmpeg_thread_run_cmd(int cmdnum,char **argv);
9+
10+
void ffmpeg_thread_exit(int ret);
11+
12+
void ffmpeg_thread_callback(void (*cb)(int ret));
13+
14+
void ffmpeg_thread_cancel();

0 commit comments

Comments
 (0)