当我们使用写了两个JNI方法,一个用于申请一个结构体,一个用于清理结构体
typedef struct man
{
char *name;
int age;
}stMan,*pstMan;
JNIEXPORT JNICALL jbyteArray malloc
(JNIEnv *env, jobject this Obj)
{
int length = 2;
pstMan stman = (pstMan)malloc(length* sizeof(stMan));
//这里我们给这2个人的名字malloc内存,并填充
......malloc
if (NULL != path)
{
//创建了一个1000个字节的数组,当path是结构体指针时,同样适用
jbyteArray byteArray = (*env)->NewByteArray(env, sizeof(stman));
//将path指向的数组数据赋值给java字节数组byteArray中
(*env)->SetByteArrayRegion(env,byteArray,0,sizeof(stman),(jbyte*)stman);
//将数组作为返回值返回给调用者
return byteArray;
}
}
JNIEXPORT void JNICALL close
(JNIEnv *env, jobject thisObj, jbyteArray byteArrayData)
{
jbyte* byteArrayData_temp = (*env)->GetByteArrayElements(env, byteArrayData, NULL);
//清理name申请的空间
......
//清理stman的空间
free(byteArrayData_temp);//典型的错误
(*env)->ReleaseByteArrayElements(env, byteArrayData, byteArrayData_temp,0);
//ReleaseByteArrayElements这个方法的使用第三个参数是0时,不同步指针指向的数据的数据
//如果想同步,那就使用JNI_ABORT
}
上面的写法就是典型的错误
在malloc方法中,没有清除stman申请的堆上的空间,会造成内存的泄露
在close方法中,清除java的数组byteArrayData,会使JVM的堆栈结构崩溃