【总结】JNI使用个人经验

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会自动回收

阅读(1020) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
原文地址:https://www.cnblogs.com/black/p/5171787.html