美文网首页初探移动多媒体
自己写视频播放器(2) 应用libffmpeg.so

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

作者: SHUTUP | 来源:发表于2015-04-19 07:15 被阅读1329次

    这部分我们测试一下我们通过自己写视频播放器(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 <jni.h>
    /* 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 <jni.h>
    #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

        本文链接:https://www.haomeiwen.com/subject/cbiefttx.html