C/C++&java communicate with each other 之 video snapshot
2015-06-19 17:35
573 查看
场景: android应用层间隔1秒调用底层driver上C API,获取到framebuffer, 提供给android layer业务分析。
TvVideoRecord 主要功能
1. 申请一个ByteBuffer对象frameBuffer
2. 将frameBuffer传给底层c接口jni_getFrameBuffer, 该函数会将TV画面帧填充进去
3. 最后调用接口ITVCaptureVideoListener onSuccess方法,将frameBuffer传给应用层的TvCaptureVideolistenerDemo
做相应处理,如save, 识别等等。
ITVCaptureVideoListener 功能:
业务层TVCaptureVideoListenerDemo实现该接口,可以监听底层capture的情况,获取到frameBuffer并做相应处理,或获知错误情况进行处理
而在jni层处理时,应注意的一些性能和内存泄漏问题
1.
JNI层主动更新java层对象,通过cache jfield来优化频繁调用例如GetFieldID映射java字段到jni.
只需SetIntField。
static int cacheVRegFieldID(JNIEnv* env)
{
jclass clazz = (*env)->FindClass(env, "com/smarttv/tvshare/TvVideoRecord$VideoRegion");
if (0 == clazz) {
__android_log_print(ANDROID_LOG_ERROR, TAGSTR, "FindClass VideoRegion returned 0\n");
return -1;
}
wid = (*env)->GetFieldID(env, clazz, "mWidth", "I");
hid = (*env)->GetFieldID(env, clazz, "mHeight", "I");
if (0 == wid || 0 == hid)
{
__android_log_print(ANDROID_LOG_ERROR, TAGSTR, "GetFieldID returned 0\n");
return -1;
}
return 0;
}
2. 容易发生jni层 内存泄漏,如java对象转为C处理时
如GetByteArrayElements, 对应ReleaseByteArrayElements需要调用来释放资源。
GetStringUTFChars-ReleaseStringUTFChars。
TvVideoRecord 主要功能
1. 申请一个ByteBuffer对象frameBuffer
2. 将frameBuffer传给底层c接口jni_getFrameBuffer, 该函数会将TV画面帧填充进去
3. 最后调用接口ITVCaptureVideoListener onSuccess方法,将frameBuffer传给应用层的TvCaptureVideolistenerDemo
做相应处理,如save, 识别等等。
ITVCaptureVideoListener 功能:
业务层TVCaptureVideoListenerDemo实现该接口,可以监听底层capture的情况,获取到frameBuffer并做相应处理,或获知错误情况进行处理
而在jni层处理时,应注意的一些性能和内存泄漏问题
1.
JNI层主动更新java层对象,通过cache jfield来优化频繁调用例如GetFieldID映射java字段到jni.
只需SetIntField。
static int cacheVRegFieldID(JNIEnv* env)
{
jclass clazz = (*env)->FindClass(env, "com/smarttv/tvshare/TvVideoRecord$VideoRegion");
if (0 == clazz) {
__android_log_print(ANDROID_LOG_ERROR, TAGSTR, "FindClass VideoRegion returned 0\n");
return -1;
}
wid = (*env)->GetFieldID(env, clazz, "mWidth", "I");
hid = (*env)->GetFieldID(env, clazz, "mHeight", "I");
if (0 == wid || 0 == hid)
{
__android_log_print(ANDROID_LOG_ERROR, TAGSTR, "GetFieldID returned 0\n");
return -1;
}
return 0;
}
2. 容易发生jni层 内存泄漏,如java对象转为C处理时
如GetByteArrayElements, 对应ReleaseByteArrayElements需要调用来释放资源。
GetStringUTFChars-ReleaseStringUTFChars。
相关文章推荐
- C语言回顾(一、C简介及基础知识)——iOS开发基础
- Bjarne Stroustrup对C++程序员的忠告
- Bjarne Stroustrup对C++程序员的忠告
- LeetCode 之 Two Sum — C++ 实现
- C++初始化列表
- C++求数组最小(大)n位数字的数组解法
- C++ 虚函数的知识点
- C语言指针的那些事(二)
- C++ 线程学习
- C语言指针的那些事(一)
- C++为类中提供类成员的初始化列表(★firecat推荐★)
- CTime 与 CString 转换
- 自制工具:CSV代码生成器:自动生成CSV文件对应的C++实体类和字段类型解析代码
- C++中静态成员函数访问成员变量问题
- WinCE下DLL的加载和调用
- C语言-EOF和feof()判断文件结尾的区别
- C++回调函数误区
- 文件操作
- 深度探索C++对象模型-指向Data Members的指针
- 不用C++模版实现queue