- 论坛徽章:
- 0
|
本帖最后由 fenghw8088 于 2014-03-06 10:14 编辑
项目需要java调c函数,在带有汉字的字符串转换时出现内存泄露(源码如下),我对java了解非常有限,希望跨界的高手帮助改正,非常感谢!
代码中的笑脸符是右括号
JNIEXPORT jint JNICALL Java_ah3dri_JQuery(JNIEnv *env, jobject obj, jstring expr)
{
int ret=-1;
//输入字符串expr有汉字,需进行编码转换,但导致内存泄露
jbyteArray barray;
jbyte *b;
jclass clsstring = (*env)->FindClass(env, "java/lang/String" ) ;
jmethodID mstr = (*env)->GetMethodID(env, clsstring, "getBytes", "(Ljava/lang/String; )[B" ) ;
jstring nstr = (*env)->NewStringUTF(env, "GBK" );
barray = (*env)->CallObjectMethod(env, expr, mstr, nstr );
b = (*env)->GetByteArrayElements(env, barray, JNI_FALSE) ;
ret = JQuery((char *)b);
free(b);
//(*env)->ReleaseByteArrayElements(env, barray, b, 0);
return ret;
}
//C中汉字串转java的汉字串,也有内存泄露
jstring char2jstring(JNIEnv *env, char *buf)
{
jbyteArray barray;
jstring jresult;
jclass clsstring = (*env)->FindClass(env, "java/lang/String" );
jstring nstr = (*env)->NewStringUTF(env, "GBK" );
jmethodID mstr = (*env)->GetMethodID(env, clsstring, "<init>", "([BLjava/lang/String; )V" );
barray = (*env)->NewByteArray(env, strlen(buf));
(*env)->SetByteArrayRegion(env, barray, 0, strlen(buf), (jbyte*)buf);
jresult = (jstring)(*env)->NewObject(env, clsstring, mstr, barray, nstr);
return jresult;
}
|
|