【音视频安卓开发 (十)】jni开发中将java中的buffer映射到native c++中

首先在java层定义一个buffer,并且开辟相应的内存空间

private ByteBuffer byteBuffer;
byteBuffer = ByteBuffer.allocateDirect(bytesPerFrame * framesPerBuffer );

然后调用本地的方法来设置内存地址到native层,该方法在jni初始化时就已经被动态的注册了方法,注册的时候直接调用了底层的c++代码并且,通过java底层操作获取了buffer的内存地址,保存到了native c++中

nativeCacheDirectBufferAddress(byteBuffer, nativeAudioRecord);
{ALOGD("ctor%s", GetThreadInfo().c_str());// RTC_DCHECK(audio_parameters_.is_valid());// RTC_CHECK(j_environment_);JNINativeMethod native_methods[] = {{"nativeCacheDirectBufferAddress", "(Ljava/nio/ByteBuffer;J)V",reinterpret_cast<void*>(&webrtc::AudioRecordJni::CacheDirectBufferAddress)},{"nativeDataIsRecorded", "(IJ)V",reinterpret_cast<void*>(&webrtc::AudioRecordJni::DataIsRecorded)}};j_native_registration_ = j_environment_->RegisterNatives("com/ifreetalk/ftalk/module/audio/engine/AudioRecord",native_methods, arraysize(native_methods));j_audio_record_.reset(new JavaAudioRecord(j_native_registration_.get(),j_native_registration_->NewObject("<init>", "(Landroid/content/Context;J)V",JVM::GetInstance()->context(), PointerTojlong(this))));// Detach from this thread since we want to use the checker to verify calls// from the Java based audio thread.thread_checker_java_.DetachFromThread();
}
void JNICALL AudioRecordJni::CacheDirectBufferAddress(JNIEnv* env, jobject obj, jobject byte_buffer, jlong nativeAudioRecord) {webrtc::AudioRecordJni* this_object =reinterpret_cast<webrtc::AudioRecordJni*> (nativeAudioRecord);this_object->OnCacheDirectBufferAddress(env, byte_buffer);
}void AudioRecordJni::OnCacheDirectBufferAddress(JNIEnv* env, jobject byte_buffer) {//ALOGD("OnCacheDirectBufferAddress");//RTC_DCHECK(thread_checker_.CalledOnValidThread());//RTC_DCHECK(!direct_buffer_address_);direct_buffer_address_ =//内存地址映射env->GetDirectBufferAddress(byte_buffer);jlong capacity = env->GetDirectBufferCapacity(byte_buffer);//计算内存大小
//  ALOGD("direct buffer capacity: %lld", capacity);direct_buffer_capacity_in_bytes_ = static_cast<size_t>(capacity);//960
}void JNICALL AudioRecordJni::DataIsRecorded(JNIEnv* env, jobject obj, jint length, jlong nativeAudioRecord) {webrtc::AudioRecordJni* this_object =reinterpret_cast<webrtc::AudioRecordJni*> (nativeAudioRecord);this_object->OnDataIsRecorded(length);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/335722.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

maya室内模型_C4d和3dmax、maya相比有什么优势?

C4D和3dmax、maya都是三维软件&#xff0c;功能都是非常的nice&#xff0c;很多新手小伙伴就在好奇它们有什么区别&#xff0c;对比之下&#xff0c;c4d有哪些优势&#xff1f;c4d和3dmax的主要应用领域就是区分它们的地方。C4D一般用于栏目包装&#xff0c;影视后期&#xff0…

HH SaaS电商系统的标签系统设计

文章目录打标规则公式打标公式变量修改标签删除标签标签实体标签与对象的关系标签和商品&#xff1a;标签和商城会员&#xff1a;标签和租户会员&#xff1a;打标规则公式 公式名称&#xff1a;近日销量创历史新高 规则公式&#xff1a;近$ {days}销量创历史新高 公式名称&a…

jvm高并发_在JVM上对高并发HTTP服务器进行基准测试

jvm高并发在第一篇关于HTTP客户端的文章 &#xff08;我将您重定向到JVM上的高效HTTP的介绍&#xff09;之后&#xff0c;现在让我们来谈谈HTTP 服务器 。 有一些关于HTTP服务器的基准测试&#xff0c;但通常受到诸如以下缺点的阻碍&#xff1a; 没有有效地执行高并发方案&am…

【WebRTC---源码篇】(十)WEBRTC/RTCP SR持续更新中)

关于WebRTC/SR(发送者报告)的内容可以通过阅读以下链接来查看,本文重点研究WebRTC源码中RTCP报文构造和发送,以及相关的数据从何而来。在发送端,RTCP以周期性发送为基准,辅以RTP报文发送时的及时发送和REMB报文的立即发送。发送过程主要包括Feedback信息获取、RTCP报文构…

excel未完全加载怎么办_你知道如何改变Excel的打开姿势吗?

你是否曾经想过在启动Excel时自动打开某些特定的文档&#xff1f;当然&#xff0c;你永远都可以手动去打开任何一个文档&#xff0c;但是如果有那么一种可能&#xff0c;去每次省下那么几秒来自动完成这一操作&#xff0c;你会愿意尝试吗&#xff1f;今天&#xff0c;火箭君就和…

电商系统的售后模块设计

文章目录售后单实体方案一方案二服务类型可选售后服务判断规则退款类型售后截止时间金币和优惠券如何返还买家端订单列表的“售后按钮”逻辑说明服务端处理逻辑买家端操作“售后按钮”页面跳转逻辑商家管理后台订单列表的“售后处理”逻辑说明服务端处理逻辑商家端操作“售后处…

Gradle技巧–显示buildscript依赖性

在Gradle中如何显示和分析buildscript依赖项&#xff08;例如插件&#xff09;的简单方法 介绍 这是我的Gradle技巧迷你系列的第三部分&#xff0c;该系列与可视化和依赖性分析有关。 在第一篇文章中&#xff0c;我介绍了如何显示多项目构建中所有子项目的依赖关系的方法。 在…

任意采样率转16K采样率

import osdef OtherTo16bit(Path, data):InPath Path \\ dataOutPath os.getcwd() \\16home\\ data.split(".")[0] ".wav"os.system(ffmpeg -i InPath -acodec pcm_s16le OutPath)# path定义要获取的文件名称的目录&#xff08;C盘除外&#…

python中元组和列表转化_4.Python列表/元组/集合/字典

4.1 Python列表• 列表用 [ ] 标识&#xff0c;是Python 最通用的复合数据类型。• 列表用 [ ] 表示&#xff0c;列表具有可嵌套性4.1.1 Python列表截取• 列表可以使用 [头下标:尾下标] 截取相应的子列表&#xff0c; 从左到右索引默认 0 开始&#xff0c;从右到左索引默认-1开…

JavaBean中的属性

让我们一步一步了解&#xff1a; 成员变量 public class Test { //成员变量 private String n; }属性 属性是 getXxx()方法去掉 get 后&#xff0c;将首字母小写的那个单词&#xff0c;此处属性名与成员变量名相同&#xff0c;都是“n” 注&#xff1a;属性名和成员变量名通…

重置线程中断状态_记住要重置线程上下文类加载器

重置线程中断状态我很难思考与Java 加载有关的东西&#xff0c;而不是与类加载器有关的东西。 在使用应用程序服务器或OSGi的情况下尤其如此&#xff0c;在这些应用程序服务器或OSGi中&#xff0c;经常使用多个类加载器&#xff0c;并且透明地使用类加载器的能力降低。 我同意O…

【WebRTC---源码篇】(十一)WebRTC编码与发送H264持续更新中

H264在WebRTC中是如何编解码的? h264编解码代码位于文件src\modules\video_coding\codecs\h264下 #ifndef MODULES_VIDEO_CODING_CODECS_H264_INCLUDE_H264_H_ #define MODULES_VIDEO_CODING_CODECS_H264_INCLUDE_H264_H_#include <memory> #include <vector>#i…

python大一题库西农_生态学(西北农林科技大学)知到智慧树2020章节测试答案...

生态学(西北农林科技大学)知到智慧树2020章节测试答案更多相关问题【单选题】在测定食品中灰分含量时,灼烧残留物不可能存在的是( )A. 蔗糖 B. 钠 C. 钾 D. 氯【单选题】对于老年骨质疏松说法错误的是( )A. 老年骨质疏松症属于继发性骨质疏松症 B. 是使骨质脆性增加导致骨折危险…

EL表达式学习笔记

文章目录EL 表达式是干什么用的EL 表达式的底层原理EL 表达式可以用在哪些地方EL 表达式用来访问 JavaBean 的属性EL 表达式获取请求参数的值EL 表达式用于运算&#xff0c;将结果作为标签的属性值或者直接输出Struts2 的 EL 表达式EL 表达式翻译为 Java 代码的含义EL 表达式示…

【WebRTC---源码篇】(十二)WebRTC/RTX协议

在SDP中可以查询到提前协商好的RTX信息 接受到RTCP NACK 重传RTX包,有效荷载前两个字节为原始seqnumber 如何知道重传的是哪个包 发送RTX

stackoverflow_Stackoverflow:您尚未发现的7个最佳Java答案

stackoverflow您可以在Stackoverflow上找到哪些最有趣的答案&#xff1f; Stackoverflow是开发人员的金矿。 它可以帮助我们找到遇到的特定问题的最有用答案&#xff0c;并且我们总是从中学习新事物。 在以下文章中&#xff0c;我们研究了最受欢迎的Java问题和答案&#xff0…

json请求 post vue_Spring Boot+Vueaxios异步请求数据的12种操作(上篇)

Java大联盟致力于最高效的Java学习关注Spring Boot Vue 前后端分离最核心的操作就是通过异步请求完成数据同步&#xff0c;这其中又可以分为很多种不同的情况&#xff0c;比如是 GET 请求还是 POST 请求&#xff1f;参数是普通变量还是 JSON&#xff1f;基于 RESTful 架构如何…

数据库SQL语言分类(DDL/DML/DQL/TCL/DCL)

文章目录一、数据定义语言 DDL&#xff08;一&#xff09;create 数据库对象的创建&#xff08;二&#xff09;alter 修改数据库对象&#xff08;三&#xff09;drop 删除数据库对象&#xff08;四&#xff09;truncate 清空表数据二、数据操纵语言 DML&#xff08;一&#xff…

【WebRTC---源码篇】(十三)WebRTC/Pacer

pacer作用 NextSendTime Timestamp PacingController::NextSendTime() const {Timestamp now = CurrentTime();if (paused_) {return last_send_time_ + kPausedProcessInterval;}// If probing is active, that always takes priority.if (prober_.IsProbing()) {Timest…

卡夫卡如何分区_通过分区在卡夫卡实现订单担保人

卡夫卡如何分区Kafka最重要的功能之一是实现消息的负载平衡&#xff0c;并保证分布式集群中的排序&#xff0c;否则在传统队列中是不可能的。 首先让我们尝试了解问题陈述 让我们假设我们有一个主题&#xff0c;其中发送消息&#xff0c;并且有一个消费者正在使用这些消息。 …