JNI中的ReleaseStringUTFChars导致崩溃(SIGSEGV)

时间:2018-07-21 08:08:03

标签: java android java-native-interface

我正在android studio中的JNI中使用此代码。一些用例会使崩溃,而其他一些则在运行时起作用。也许与内存泄漏有关。 我收到此错误:
SIGSEGV(信号SIGSEGV:无效地址(故障地址:0xffffffffdeadbaad))

jstring jstr1 =(* env)-> NewStringUTF(env,“”);     char * m1 =(char *)(* env)-> GetStringUTFChars(env,jstr1,0);

jstring jstr2 = (*env)->NewStringUTF(env, "-");
char *m2 = (char *)(*env)->GetStringUTFChars(env,jstr2, 0);

jstring jstr3 = (*env)->NewStringUTF(env, "");
char *aaa = (char *)(*env)->GetStringUTFChars(env,jstr3, 0);

// ...

strcat(aaa,m1);
(*env)->ReleaseStringUTFChars(env, jstr1, m1);//no problem

strcat(bbb,m2);
(*env)->ReleaseStringUTFChars(env, jstr2, m2);//no problem

strcat(str,aaa);
//(*env)->ReleaseStringUTFChars(env, jstr3, aaa);//crash

strcat(str,bbb);
(*env)->ReleaseStringUTFChars(env, jstr4, bbb);//no problem

strcat(str,m3);
(*env)->ReleaseStringUTFChars(env, jstr5, m3);//no problem

strcat(str,ccc);
jstring res = (*env)->NewStringUTF(env, str);
//(*env)->ReleaseStringUTFChars(env, jstr6, str);//crash

2 个答案:

答案 0 :(得分:3)

char *aaa = (*env)->GetStringUTFChars(...);
// ...
strcat(aaa, ...);

您不能这样做。 aaa源自GetStringUTFChars()。您无法四处追加。不是你的在您自己的内存空间中附加到您自己的数据。

答案 1 :(得分:1)

在填充之前创建自己的输出。

char *output = (char *) calloc( strlen(aaaa) + strlen(m1), sizeof(char) );     
strcpy( output, aaaa );
strncat( output, m1, strlen(m1) );