`btMultiSphereShape` 中的局部引用累加 `Vector3[]` 转换
描述错误
我发现在多相圈元件 ' Vector3 ' 转换辅助器中可能有JNI本地参考漏洞。 帮助者为每个 Java `Vector3' 调用“ Get ObjectArrayElement () ”, 但返回的本地引用不被删除。
档案:`扩展/gdx-bullet/jni/swig/collision/bt多层形状'。
生成的文件 : `延伸/gdx-bullet/jni/swig-src/collision/collision wrap.cpp'
函数: `Vector3 ArrayTotVector3' 阵列 '
相关代码 :
++ 组合键 btVector3 * 矢量3 ArrayToBtVector3 Array(JNIEnv * Jenv,工作设计箭头来源) { 静态 jfieldID x Field = NULL,y field = NULL,z Field = NULL; 静态 jfieldID x Field = NULL,y Field = NULL,z Field = NULL; 静态 : jint len = jenv- > GetArrayLength(来源); 如果( len <= 0) 还原 NULL ;
btVector3*结果=新btVector3[len]; 2.
如果(x Field == NULL) { jobject vec = jenv- > Get ObjectArrayElement(来源,0);; j类 sc = Jenv- > Get ObjectClass(vec) ; x Field = Jenv- > Get FieldID(sc,"x","F"); 2. y Field = Jenv->Get FieldID(sc,"y","F"); 2. z Field = jenv- > Get FieldID(sc,"z","F"); 2. Jenv- > 删除本地参考文件( sc); {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
用于(int i = 0;i < len;i++){ jobject vec = Jenv- > Get ObjectArray Element(来源,一); 结果[i]. setValue(jenv- > GetFloat Field(vec,xField),Jenv->GetFloat Field(vec,yField),Jenv->GetFloat Field(vec,zField)); {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? 返回结果; {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
`Get ObjectArrayElement ()' 返回一个 JNI 本地引用 。 循环产生一个
每个输入元素的本地引用并保持全部活到本地
方法返回。 如果有一个足够大的 " Vector3[] " ,这可能会使JNI 当地
一次通话时参考表。
场-缓存初始化路径也有更小的一次性漏出:
源 [0] 对象的本地引用用于获取类,但仅用于
类别参考 " sc " 被删除。
用于“ btVector3 + ” 的 SWIG 类型图 的此帮助 :
++ 组合键
%typemap( in, s碎片="gdx Bullet helpers Vector3Array, noblock=1) btVector3 * {
静态 jfieldID x Field = NULL,y field = NULL,z Field = NULL; 静态 jfieldID x Field = NULL,y Field = NULL,z Field = NULL; 静态 :
1美元=矢量3ArrayToBtVector3Array(jenv, $input);
gdxAutoDeleteBtVector3 自动列车 delete(1美元);
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?Java-facing 构造器到达此路径 :
贾瓦 公有bt多相圈形状(Vector 3[] 位置,浮出[] 光度,内数Sphers){ 3⁄4 ̄ ̧漯B {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
建议的固定:在复制每个 " vec " 本地参考之后删除;
并删除 " x 外地 " 初始化时使用的 " vec " 本地参考,
`y Feld'和`z Feld'。 应该用
`bt多相圈形状.i',然后生成的SWIG包装被重新生成。
例如:
++ 组合键
jobject vec = Jenv- > Get ObjectArray Element(来源,一);
结果[i]. setValue(jenv- > GetFloat Field(vec,xField),Jenv->GetFloat Field(vec,yField),Jenv->GetFloat Field(vec,zField));
Jenv- > 删除本地参考文献( vec);- 复制
无回复( N)
翻译:
无回复( N)
QQ 堆积跟踪
贝壳
受影响的平台
- [ ] 机器人
- [ ]iOS系统
- [ ] HTML/GWT
- [
. . . . . . .内容来源: libgdx/libgdx