android jni中将大数据回调到java层的时候用法,比如视频流,音频流等,图片流等 比如我用ffmpeg解码好视频流,想送到java层使用opengGL进行显示,opencv进行人脸识别等等
来源:互联网 发布:java httpclient ssl 编辑:程序博客网 时间:2024/06/12 01:44
android jni中将大数据回调到java层的时候用法,比如视频流,音频流等,图片流等 比如我用ffmpeg解码好视频流,想送到java层使用opengGL进行显示,opencv进行人脸识别等等
java层
//将解码好后的视频流回调回来 public void CallBack_VideoDecodeData(Object object, int len) { //这里强制转换为ByteBuffer即可 ByteBuffer buffer = (ByteBuffer) object; if (videoDecodeSteamCallBack != null) { videoDecodeSteamCallBack.onVideoDecodeData(buffer, len); } }
jni层
g_CallBack_VideoDecodeData = (*env)->GetMethodID(env,clazz, "CallBack_VideoDecodeData", "(Ljava/lang/Object;I)V");
/*** 直播的时候视频回调,这个是解码好后的视频*/int RT_VideoDecodeDataCallBack(uint8_t *data,int len){ JNIEnv *env; int cRet= RT_GetEnv(&env); if(cRet==-1){ return 0; } if(g_CallBack_VideoDecodeData == NULL){ LOGE("[%s:%d]g_CallBack_VideoDecodeData=NULL!\n",__FUNCTION__,__LINE__); return 0; }#if 0 /* 使用这种方式,效率很低,并且内存抖动非常大 */ jbyteArray bytes = 0; bytes = (*env)->NewByteArray(env, len); if (bytes != NULL) { (*env)->SetByteArrayRegion(env, bytes, 0, len,(jbyte *)data); } (*env)->CallVoidMethod(env,g_callBackHandle.callBackObj,g_CallBack_VideoDecodeData,bytes,len); (*env)->DeleteLocalRef (env,bytes);#else /* 使用这种方式回调回去,效率会高很多,少了内存的拷贝,使用上面这种方式是要经过内存拷贝的 */ jobject _buf = (jobject)0; _buf = (*env)->NewDirectByteBuffer(env,data,len); (*env)->CallVoidMethod(env,g_callBackHandle.callBackObj,g_CallBack_VideoDecodeData,_buf ,len); (*env)->DeleteLocalRef (env,_buf);#endif //如果是绑定的方式,要解绑 if(cRet){ (*g_callBackHandle.javaVM)->DetachCurrentThread(g_callBackHandle.javaVM); } return 0;}
android openGL glMapBufferRange源码也是这样用的
// C function GLvoid * glMapBufferRange ( GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access ) public static native java.nio.Buffer glMapBufferRange( int target, int offset, int length, int access );
对应的jni层
/* GLvoid * glMapBufferRange ( GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access ) */static jobjectandroid_glMapBufferRange__IIII(JNIEnv *_env, jobject _this, jint target, jint offset, jint length, jint access) { GLvoid* _p = glMapBufferRange((GLenum)target, (GLintptr)offset, (GLsizeiptr)length, (GLbitfield)access); jobject _buf = (jobject)0; if (_p) { _buf = _env->NewDirectByteBuffer(_p, length); } return _buf;}
唯一区别 的是它不需要手动的释放,因为它是以返回值的方式返回,会由java虚拟机自动回收,如果像我这样的写的话,必须要调用(*env)->DeleteLocalRef (env,_buf);要不很快就会
A/art: art/runtime/indirect_reference_table.cc:115] JNI ERROR (app bug): local reference table overflow (max=512) A/art: art/runtime/indirect_reference_table.cc:115] local reference table dump: A/art: art/runtime/indirect_reference_table.cc:115] Last 10 entries (of 512): A/art: art/runtime/indirect_reference_table.cc:115] 511: 0x12e09500 java.nio.DirectByteBuffer A/art: art/runtime/indirect_reference_table.cc:115] 510: 0x12e094c0 java.nio.DirectByteBuffer A/art: art/runtime/indirect_reference_table.cc:115] 509: 0x12e09480 java.nio.DirectByteBuffer A/art: art/runtime/indirect_reference_table.cc:115] 508: 0x12e09440 java.nio.DirectByteBuffer A/art: art/runtime/indirect_reference_table.cc:115] 507: 0x12e09400 java.nio.DirectByteBuffer A/art: art/runtime/indirect_reference_table.cc:115] 506: 0x12e093c0 java.nio.DirectByteBuffer A/art: art/runtime/indirect_reference_table.cc:115] 505: 0x12e09380 java.nio.DirectByteBuffer A/art: art/runtime/indirect_reference_table.cc:115] 504: 0x12e09340 java.nio.DirectByteBuffer A/art: art/runtime/indirect_reference_table.cc:115] 503: 0x12e09300 java.nio.DirectByteBuffer A/art: art/runtime/indirect_reference_table.cc:115] 502: 0x12e092c0 java.nio.DirectByteBuffer A/art: art/runtime/indirect_reference_table.cc:115] Summary: A/art: art/runtime/indirect_reference_table.cc:115] 512 of java.nio.DirectByteBuffer (512 unique instances)
阅读全文
0 0
- android jni中将大数据回调到java层的时候用法,比如视频流,音频流等,图片流等 比如我用ffmpeg解码好视频流,想送到java层使用opengGL进行显示,opencv进行人脸识别等等
- 使用 ffmpeg 进行网络推流:拉流->解封装->解码->处理原始数据(音频、视频)->编码->编码->推流
- Android java层与jni之间字符串数据传递需进行编码解码操作
- Android音视频学习第2章:使用ffmpeg进行音频解码
- 利用ffmpeg和opencv进行视频的解码播放
- 利用ffmpeg和opencv进行视频的解码播放
- 利用ffmpeg和opencv进行视频的解码播放
- 利用ffmpeg和opencv进行视频的解码播放
- 利用ffmpeg和opencv进行视频的解码播放
- 如DataView,我好操作,比如过滤,筛选数据等
- ffmpeg几个命令的使用:分离视频音频等
- Android JNI实现简单的c层调用Java层函数(C层调用Java层Toast进行提示)
- 用 ffmpeg 对视频进行转码,分割等操作
- 在使用 GridView的时候,有时需要多选上面显示的类容,比如批量删除上面显示的图片,批量上传图片等。
- FFMpeg视频解码+OpenCV显示
- FFMPEG SDK流媒体开发2---分离.mp4等输入流音视频并且进行解码输出
- 利用libavdecode进行视频码流的解码流程
- 使用ffmpeg进行音频解码
- spring-data-redis scan 中的cursor关闭
- java安全沙箱(四)之安全管理器及Java API
- 高性能MYSQL--第一章
- sort-cut-wc用法详解
- POJ 2356 Find a multiple【鸽巢原理】
- android jni中将大数据回调到java层的时候用法,比如视频流,音频流等,图片流等 比如我用ffmpeg解码好视频流,想送到java层使用opengGL进行显示,opencv进行人脸识别等等
- 求最大子列和(时间复杂度分别为O(n3) O(n2) O(n))
- 完胜竞争对手的seo临门一脚
- leetcode---anagrams---字符串
- es6 导出class模块
- 【整理】Word OpenXML常用标签
- SOA、SOAP、RPC、REST、DUBBO的区别与联系
- Spring Boot Jpa 常用操作语句
- 进程池线程池