java - JNI 中的 ReleaseStringUTFChars 导致崩溃 (SIGSEGV)

标签 java android java-native-interface

我在 android studio 的 JNI 中使用这段代码。一些用例在运行时导致崩溃和其他工作。也许这与内存泄漏有关。 我收到此错误:
SIGSEGV (signal SIGSEGV: invalid address (fault address: 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

最佳答案

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

你不能这样做。 aaa 派生自 GetStringUTFChars()。你不能四处追加它。这不是你的。在您自己的内存空间中追加您自己的数据。

关于java - JNI 中的 ReleaseStringUTFChars 导致崩溃 (SIGSEGV),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51454137/

相关文章:

java - 快速排序算法的动画

Java(安卓): how to average rgb in specific area

java - 有没有办法在没有鼠标的情况下扩展 JFileChooser 目录

android - 通过点击 map 获取坐标(openstreetmaps)

java - 在 Java 中封装 C/C++

java - 忙碌时无法将 Java 窗口置于最前面

java - 如何在 iText 中创建 "reply"到便笺注释

java - 如何使用 Android DataBinding 动态更改 android :layout property?

android - 更改运行时添加的 ProgressBar 的宽度

java-native-interface - 如何使用JNI访问对象中的数组?