使用jni遇到的诡异内存bug

bwlcool bwlcool     2022-10-25     306

关键词:

jni返回到java层的字符串有时正确,有时错误。错误的字符串可能是任何一串字符,看起来很奇怪。

通过加日志,得知生成的jstring已经不正确了,所以怀疑生成jstring用的char*有问题,可能被释放了。

分析代码,里边用的char*是从string转来的,只要string没被释放,char*就没问题。

问题找到了,代码只持有了char*,没有持有string,string在获取char*之后就可以被释放了,string释放之后,char*的指向就错误了,所以生成的jstring就错误了。

问题代码如下:


MD5 iMD5;
iMD5.GenerateMD5((unsigned char *) finalMessage, strlen(finalMessage));
const char *result = iMD5.ToString().c_str();// 这里没有持有toString生成的string,string后面就释放了。

//生成java String

 jstring ret = env->NewStringUTF(result);

return ret;

 

修改如下:

string tempStr = iMD5.ToString();// 继续持有string
const char *result = tempStr.c_str();

// 生成java String
jstring ret = env->NewStringUTF(result);

return ret

 

和各种诡异bug打交道13年,我总结了18个经验(代码片段)

...郑芸,英文:HenrikWarne我写了我是怎样追踪这些年遇到的最有趣bug的。最近我重新浏览了这所有的194个条目(历时13年),看看我从这些bug中学到了学到了那些重要的经验教训。我分为编码、测试和调试三大类... 查看详情

处理activity#onresume()遇到java.lang.illegalargumentexception诡异异常(代码片段)

记录处理Android较为诡异的问题,Activity#onResume()发生IllegalArgumentException异常。1.Activity#onResume()异常最近在处理Bugly上的量级较大的问题,发现有一个较为奇怪的问题,发生在ActivityThread#performResumeActivity(), 查看详情

处理activity#onresume()遇到java.lang.illegalargumentexception诡异异常(代码片段)

记录处理Android较为诡异的问题,Activity#onResume()发生IllegalArgumentException异常。1.Activity#onResume()异常最近在处理Bugly上的量级较大的问题,发现有一个较为奇怪的问题,发生在ActivityThread#performResumeActivity(), 查看详情

一次“诡异”的ansible密码问题排查,最后的“真相”竟是这样

背景在做大批量运维的时候,DBA需要掌握和使用ansible。今天有同事使用ansible遇到了一个奇怪现象,和我交流了一下,我发现这个现象很奇怪,也很有趣,我认为是个BUG,于是排查,之后有了这篇文章。现象同事使用的是ansible2.7... 查看详情

jni使用碰到的问题

参考技术A记录下使用JNI的诡异问题1.传递String或int出错正常:staticint_open(JNIEnv*env,jclassthisz, jstringpath,intspeed)出问题:staticint_open(JNIEnv*env,jstringpath,intspeed)出错的原因是:把jclassthisz去掉了2.jniRegisterNativeMethods出错,提示找不到... 查看详情

(JNI) 使用 GetMethodID 获取 Java 方法的内存地址

】(JNI)使用GetMethodID获取Java方法的内存地址【英文标题】:(JNI)GetJavamethod\'smemoryaddresswithGetMethodID【发布时间】:2020-04-1904:16:35【问题描述】:如何获取我拥有JNIMethodID的方法的内存位置?我想通过使用JNI来挂钩或操作Java方法,因... 查看详情

记一次诡异的bug

问题描述:el-dialog里有一个el-select两者都被插到了body上,这就导致了当el-select获得焦点并滚动el-dialog时,el-select的下拉框滚出el-dialog时,并不会消失,因为他们得层级一样,都直接被插到的body上。尝试方法1(失败):给el-select... 查看详情

一个诡异的mysql查询超时问题,居然隐藏着存在了两年的bug(代码片段)

这一周线上碰到一个诡异的BUG。线上有个定时任务,这个任务需要查询一个表几天范围内的一些数据做一些处理,每隔十分钟执行一次,直至成功。通过日志发现,从凌晨5:26分开始到5:56任务执行了三次,三次都因为SQL查询超... 查看详情

JNI ERROR (app bug): local reference table overflow (max=512)

...【发布时间】:2014-12-2809:53:32【问题描述】:我正在尝试使用我自己的数据集运行LibSVMAndroidClassificationAndroid项目。它与已经提供的数据集完美配合,当我使用100行的csv(小于原始大小的1%)时,它也能正常工作。但是,当我尝试... 查看详情

Java 性能调优、JNI 内存泄漏

...描述】:我有一个Java应用程序。它是一个Linux平台。我们使用的是Java6。它是普通的sdkjava加上一些JNI。我们使用visualvm来监控内存泄漏。我们注意到visualvm应用程序不会连续消耗堆。但是整个进程的内存一直在增加,直到linux杀死... 查看详情

如何在使用 JNI 的 C++/Java 项目中使用 CRT 中的工具检测内存泄漏?

】如何在使用JNI的C++/Java项目中使用CRT中的工具检测内存泄漏?【英文标题】:HowdoIdetectmemoryleaksusingthetoolsinCRTinaC++/JavaprojectusingJNI?【发布时间】:2012-03-1503:09:01【问题描述】:我已经尝试了几个小时才能让它工作。到目前为止... 查看详情

使用 JNI 在 Java 调用之间将本机对象保存在内存中

】使用JNI在Java调用之间将本机对象保存在内存中【英文标题】:KeepinganativeobjectinmemorybetweencallsfromJavausingJNI【发布时间】:2016-01-1919:09:14【问题描述】:我有一个Android应用,需要使用C库。我正在使用JNI与之交互。该库使用一个... 查看详情

Android : JNI ERROR (app bug): local reference table overflow (max=512)

...中获取特定的值;这个值会定期更新,所以我需要在需要使用的时候获取它。我正在使用JNI从本机代码调用Java代码。std::stringval;JNIEnv*env=J 查看详情

使用 JNI 和 NDK 旋转位图

】使用JNI和NDK旋转位图【英文标题】:RotatingabitmapusingJNI&NDK【发布时间】:2013-01-0203:33:45【问题描述】:背景:我已经决定,由于位图占用大量内存,很容易导致内存不足错误,我将把繁重的、消耗内存的工作放在C/C++代码上... 查看详情

ijkplayer遇到的诡异问题(代码片段)

    今天重新封装播放器界面的时候发现了一个诡异的问题。    覆盖在ijkplayer上层的View莫名其妙消失了,View确定已经被addView到了ContentView中,但是视图里就是看不到,debug也确定了被add的View已经有了Parent,a... 查看详情

记录一下max在动画制作中遇到文件大小无限膨胀的bug

...大小,不到6MB  总结一下:这个问题目前只出现在使用了biped,并使用了姿态收集和运动混合器的项目中,我已经和autodesk反映了bug,如果是项目中没有使用到这些组件,那可能是由于其他原因引起,可尝试外网这位大神... 查看详情

pgi遇到的坑

以下记录为本人在使用PGI社区版编译器遇到的问题,包含两类问题1,PGI编译器本身存在你的bug。2,在其他编译器编译运行没问题,在PGI中出现问题。版本(18.11社区版)1,(bug)内置函数,EOSHIFT,当偏移量为0的时候,数组会... 查看详情

面试中被问到你遇到的java编程中的bug你如何解决的

...这个问题我也碰到过几次了,如何解决?需要你对你大量使用的类非常熟悉,最好事先仔细看看文档,有的类需要你最后dispose的,有的类add过后需要remove的,有 查看详情