当前位置: 首页 > news >正文

聊城网站案例六安公司做网站

聊城网站案例,六安公司做网站,可以做免费推广的网站,营销策划与运营方案做安卓jni相关开发的总会在涉及到jni变量释放时怀疑人生#xff0c;what? where? when? who? why? how? how much? 最近碰到一个比较奇怪的问题#xff0c;有一个jni方法的耗时在随着调用次数的增加而上涨#xff0c;但是没有明显的内存泄漏#xff0c;经过我缜密分…做安卓jni相关开发的总会在涉及到jni变量释放时怀疑人生what? where? when? who? why? how? how much? 最近碰到一个比较奇怪的问题有一个jni方法的耗时在随着调用次数的增加而上涨但是没有明显的内存泄漏经过我缜密分析之后终于解决了深埋多年的疑惑。代码如下 void HENativeUtils::vectorFloatToJArray(JNIEnv* env, const std::vectorfloat src, jobject obj, jfieldID fieldId) {jfloatArray jArray ( jfloatArray )env-GetObjectField(obj, fieldId);if (!jArray || env-GetArrayLength(jArray) ! src.size()){jArray env-NewFloatArray(src.size());env-SetObjectField(obj, fieldId, jArray);}jfloat* array env-GetFloatArrayElements(jArray, nullptr);std::copy(src.begin(), src.end(), array);env-ReleaseFloatArrayElements(jArray, array, 0); } 这个方法提供了对一个java对象obj中的float[]成员变量进行操作的功能如果该对象为空或者size与需要被设置的对象size不一致则创建一个新的float[]并覆盖该对象。从上面代码可知我在使用完成后已经调用env-ReleaseFloatArrayElements将对应的jni数组释放为什么还存在泄漏甚至有动手能力比较强的小伙伴如果把这段代码复制到自己的jni代码中去调用可能也不会有泄漏。 关于类似这种jfloatArray/jintArray/jbyteArray等等对象什么时候需要调用env-ReleaseFloatArrayElements很多稍微有点经验的小伙伴都知道但是关于什么时候需要调用env-DeleteLocalRef相信很多人都会比较模糊。 上面这段代码之所以存在泄漏关键在于调用环境的差异。 当我们从java线程中调用cpp代码这时候每个jni方法都会带一个JNIEnv*这个JNIEnv就代表了这个java线程在这个jni方法中调用上面的方法就很正常因为这个jni会在方法结束后自动DetachCurrentThread这个自动调用相当关键就会自动清理掉jni中类似jfloatArray/jintArray/jbyteArray的局部变量。 相对应的还有一种情况就是我们在cpp中创建的线程当我们想在该线程中调用java的方法通常会调用JavaVm的AttachCurrentThread来为当前线程获取一个JNIEnv*并且在一条长时间运行的后台线程中只要我AttachCurrentThread并获取JNIEnv*之后我就可以一直使用这个JNIEnv*来调用java方法。这个时候就很容易出问题了因为这个线程的生命相当长而我们每次在这个线程中调用方法vectorFloatToJArray时都会有一个新的局部变量jfloatArray在我们自己创建的回调方法中没有自动的DetachCurrentThread所以这个变量就泄漏了。值得注意的是如果存在cpp线程-java方法-jni方法此时这个jni方法虽然看起来长得和从java线程调过来的方法一模一样但是相差甚远的是其JNIEnv*代表的其实还是前面AttachCurrentThread所获得的如果之前没有手动调用过DetachCurrentThread这里也一样会泄漏。 上面的方法保险起见应该加上一行env-DeleteLocalRef() void HENativeUtils::vectorFloatToJArray(JNIEnv* env, const std::vectorfloat src, jobject obj, jfieldID fieldId) {jfloatArray jArray ( jfloatArray )env-GetObjectField(obj, fieldId);if (!jArray || env-GetArrayLength(jArray) ! src.size()){jArray env-NewFloatArray(src.size());env-SetObjectField(obj, fieldId, jArray);}jfloat* array env-GetFloatArrayElements(jArray, nullptr);std::copy(src.begin(), src.end(), array);env-ReleaseFloatArrayElements(jArray, array, 0);env-DeleteLocalRef(jArray); } 正确姿势有两种(二选一就好了) 在每个cpp子线程调用java方法结束后都DetachCurrentThread在每个继承自jobject对象的局部变量后面都加上env-DeleeteLocalRef()
http://www.ho-use.cn/article/10812710.html

相关文章:

  • 河北省建设工程协会网站比较有趣的网站
  • 个人怎么做电影相关的网站网站建设用模板好吗
  • 呼市做网站基于asp网站开发 论文
  • ui的设计网站百度文章收录提交入口
  • 浙江网站建设与维护书我爱我家二手房房源官网
  • 扬州市广陵区城乡建设局网站wordpress英文切换
  • 搭建个网站需要多少钱m导航网站如何做淘宝客
  • 网站建设推广优化话术wordpress 高德地图
  • 呼和浩特网站建设电话网站建设制作设计营销 中山
  • 西安有哪些网站建设外包公司wordpress怎么插视频
  • 冀州建设局网站如何进行医药网站建设
  • 做购物网站的步骤大竹县国示建设专题网站
  • 钦州房产网站建设番禺网站 建设信科网络
  • 网站中加入地图鞍山做网站优化
  • 网站制作工具网站上如何做跳转页面
  • 石家庄网站建设q.479185700棒临汾网站建设费用
  • 深圳网站设计小程序wordpress手机同步
  • 新乡建站温州百度推广排名优化
  • 大良做网站的公司房产网站排行
  • 商城网站建设报价单灌南住房建设局网站
  • 南宁网站建设怎样建立一个好网站wordpress 安装 数据库
  • 十堰做网站排名进入百度公司很难吗
  • 南通高端网站建设开发郑州设计师网站
  • 鹤山做网站珠海学网站开发
  • 广州网站建设快速排名了解网站开发 后台流程
  • 赣州专业做网站微信小程序开发图解案例教程
  • 深圳做网站的公司排行网站访客qq抓取原理
  • php网站开发打不开o2o电商网站
  • 荆州北京网站建设如何查网站备案信息
  • 接收新网站如何做诊断上海做网站哪家好