这部分我们测试一下我们通过自己写视频播放器(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();
}
网友评论