请教JNI调用C++方法的内存管理问题

zzcoffeebean 2016-06-21 05:51:03
请教个JNI的问题,看下面注释的地方,这个result指针所指内存是否需要手动释放?



JNIEXPORT jfloatArray JNICALL Java_game_recast_autoHeight(JNIEnv *env, jclass jobj, jint jsn, jfloatArray jpos, jint jflag) {
try{
float pos[3];
jfloat* tmp = env->GetFloatArrayElements(jpos, 0);
dtVcopy(pos, tmp);
float* result = posHight(jsn,pos,jflag);
_jfloatArray* resultArr = env->NewFloatArray(2);
env->SetFloatArrayRegion(resultArr, 0, 2, result);

//delete result; //???这个地方如果释放掉result指针,会导致java访问内存崩溃!

return resultArr;
}catch(exception& e){
std::cerr << "posHeight err:(" << jsn << ")" << e.what() << std::endl;
}
}


env->SetFloatArrayRegion(resultArr, 0, 2, result);
这句代码是不是让resultArr指向了result的地址,然后jvm会负责回收这个内存?
...全文
341 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzcoffeebean 2016-06-25
  • 打赏
  • 举报
回复
结帖了,这两天研究了下JNI内存管理规范和c++的内存管理,基本弄清楚了
zzcoffeebean 2016-06-23
  • 打赏
  • 举报
回复
引用 5 楼 mLee79 的回复:
[quote=引用 2 楼 zzcoffeebean 的回复:] [quote=引用 1 楼 mLee79 的回复:] java 带GC的, 你管释放干嘛...
很显然这是c++代码啊[/quote] 我不认识字, JNIEnv 原来是 C++ 的啊 [/quote] float* result = posHight(jsn,pos,jflag); 我的问题是这个result是不是要手动释放
mLee79 2016-06-22
  • 打赏
  • 举报
回复
引用 2 楼 zzcoffeebean 的回复:
[quote=引用 1 楼 mLee79 的回复:] java 带GC的, 你管释放干嘛...
很显然这是c++代码啊[/quote] 我不认识字, JNIEnv 原来是 C++ 的啊
  • 打赏
  • 举报
回复
手动立即释放 env->DeleteLocalRef( t.classID ); 不释放的话gc也会自动释放
zzcoffeebean 2016-06-21
  • 打赏
  • 举报
回复
posHight方法中返回值的定义是这样的 float result[2]={0,0};
zzcoffeebean 2016-06-21
  • 打赏
  • 举报
回复
引用 1 楼 mLee79 的回复:
java 带GC的, 你管释放干嘛...
很显然这是c++代码啊
mLee79 2016-06-21
  • 打赏
  • 举报
回复
java 带GC的, 你管释放干嘛...

23,404

社区成员

发帖
与我相关
我的任务
社区描述
Java 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧