自己写视频播放器(2) 应用libffmpeg.so

这部分我们测试一下我们通过自己写视频播放器(1) 编译ffmpeg for android得到的libffmpeg.so是不是基本可以使用。因为我们只是获取一下版本信息,因此只能称为基本可用。


JNI说明

Java的JNI (Java Native Interface),又称为本地接口调用。这一机制主要是为了方便人们可以调用以前c/c++编写的库,或者提高效率,亦或者对应用进行保护(核心代码封装在底层.so库中,增加破解难度)。

JNI使用方式(以C库为例)

常见的使用方式有如下几种:
1.自己写底层的C源码
我们需要建java类文件,声明jni方法,然后生成.h文件,编写C源文件include之前生成的.h文件并实现相应方法,最后用androidNDK开发包中的ndk-build脚本生成对应的.so共享库
例子可以参考 NDK开发入门

2.已有一个C库
比如我们有了libffmpeg.so 。我们还得编译一个so文件,这个so里的是jni方法,可以由java层调用的,而这些jni方法里用到的函数则来至libffmpeg.so库

创建 JNIProxy类

package com.example.myplayer1;

public class JNIProxy {
    public native boolean ffmpegInit();//Jni方法
    public native boolean ffmpegUninit();
    public native int ffmpegGetAvcodecVersion();
}

生成 com_example_myplayer1_JNIProxy.h

tip:获得本地方法头文件
jdk6.0:在Android工程的bin\classes目录下执行:javah 包名+类名
jdk7.0:在Android工程的src目录下执行:javah 包名+类名

javah com.example.myplayer1.JNIProxy

这个文件和你的工程的包名类名是相关的,其内容如下

/* DO NOT EDIT THIS FILE - it is machine generated */
#include 
/* Header for class com_example_myplayer1_JNIProxy */

#ifndef _Included_com_example_myplayer1_JNIProxy
#define _Included_com_example_myplayer1_JNIProxy
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_myplayer1_JNIProxy
 * Method:    ffmpegInit
 * Signature: ()Z
 */
JNIEXPORT jboolean JNICALL Java_com_example_myplayer1_JNIProxy_ffmpegInit
  (JNIEnv *, jobject);

/*
 * Class:     com_example_myplayer1_JNIProxy
 * Method:    ffmpegUninit
 * Signature: ()Z
 */
JNIEXPORT jboolean JNICALL Java_com_example_myplayer1_JNIProxy_ffmpegUninit
  (JNIEnv *, jobject);

/*
 * Class:     com_example_myplayer1_JNIProxy
 * Method:    ffmpegGetAvcodecVersion
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_com_example_myplayer1_JNIProxy_ffmpegGetAvcodecVersion
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

实现jni方法

#include 
#include "avcodec.h"
#include "avformat.h"
#include "com_example_myplayer1_JNIProxy.h"
//要保证头文件导入正常
/* Class:     com_example_myplayer1_JNIProxy
 * Method:    ffmpegInit
 * Signature: ()Z
 */
JNIEXPORT jboolean JNICALL Java_com_example_myplayer1_JNIProxy_ffmpegInit
  (JNIEnv *env, jobject obj){
    av_register_all();
    return 1;
}

/*
 * Class:     com_example_myplayer1_JNIProxy
 * Method:    ffmpegUninit
 * Signature: ()Z
 */
JNIEXPORT jboolean JNICALL Java_com_example_myplayer1_JNIProxy_ffmpegUninit
  (JNIEnv *env, jobject obj){
    return 1;
}

/*
 * Class:     com_example_myplayer1_JNIProxy
 * Method:    ffmpegGetAvcodecVersion
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_com_example_myplayer1_JNIProxy_ffmpegGetAvcodecVersion
  (JNIEnv *env, jobject obj){
    return avcodec_version();
}

你可能感兴趣的:(自己写视频播放器(2) 应用libffmpeg.so)