【总结】JNI使用个人经验

本文探讨了C++与Java交互过程中的关键问题,包括回调Java函数时避免使用局部栈变量、正确处理byte[]类型参数及C++调用JNI New接口生成对象后的释放问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,C++回调Java函数时,传递给Java的参数不能为C++的局部栈变量,因为C++函数跳出时立即回收了此变量,Java的回调函数中无法访问此变量,此时JVM会崩溃(Crash),并抛出异常:EXCEPTION_ACCESS_VIOLATION处理方式为:使用JNIEnv*提供的New接口复制数据,再传递给Java函数;或者确保这个变量是堆对象,不过C++自己new出来的堆对象貌似也不能直接传给Java,应该还是需要通过JNIEvn*提供的接口复制一份JNI的参数类型再传给Java


2,Java的byte[]参数类型对应JNI中的jbyteArray参数类型,在C++中不能将jbyteArray强制转换为char*,可以先获取jbyte* byteArr = env->GetByteArrayElements(jbyteArray, false);,再将jbyte*强转转换为char*。char* charArr = (char*)byteArr;


3,C++调用JNI的New接口生成的对象,如果不传给Java,需要手动调用Release接口,否则会导致内存泄露,若传给Java就不用Release,JVN会自动回收

<script>window._bd_share_config={"common":{"bdsnskey":{},"bdtext":"","bdmini":"2","bdminilist":false,"bdpic":"","bdstyle":"0","bdsize":"16"},"share":{}};with(document)0[(getelementsbytagname('head')[0]||body).appendchild(createelement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new date()/36e5)];</script>
阅读(1020) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值