原生Android应用程序中的SIGSEGV错误

盛年不重来,一日难再晨,及时当勉励,岁月不待人。这篇文章主要讲述原生Android应用程序中的SIGSEGV错误相关的知识,希望能为你提供帮助。
我有一个使用一些cpp class的应用程序,当我第一次运行它一切都很好。但如果我想再次使用它,它会停止并且我收到此错误:

10-03 19:50:34.859:A / libc(1669):0x00000000(代码= 1)处的致命信号11(SIGSEGV),线程1907(AsyncTask#2)
有时我会收到此错误:
【原生Android应用程序中的SIGSEGV错误】10-03 20:42:56.741:A / libc(5975):致命信号7(SIGBUS)位于0x7a9d3000(代码= 2),线程6361(AsyncTask#1)
这是我的代码:
extern "C" JNIEXPORT jbyteArray JNICALL java_com_example_qonclient_Codecs_encodeG711(JNIEnv* env, jobject thiz, jshortArray sound){jsize soundLength = env-> GetArrayLength(sound); __android_log_print(ANDROID_LOG_ERROR, "NATIVE", "%d", (int)soundLength); unsigned char dst[soundLength]; // buffer jshort *buf; __android_log_print(ANDROID_LOG_ERROR, "NATIVE", "27"); // my program crash after this line env-> SetShortArrayRegion(sound, 0, soundLength, buf); __android_log_print(ANDROID_LOG_ERROR, "NATIVE", "29"); G711::ALawEncode(dst, buf , (int)soundLength); //sizeof(shortsound)); __android_log_print(ANDROID_LOG_ERROR, "NATIVE", "30"); jbyteArray result = env-> NewByteArray((int)sizeof(dst)); env-> SetByteArrayRegion(result, 0, (int)sizeof(dst), (jbyte*)dst); env-> DeleteLocalRef((jobject)buf); return result; }

如何解决这个问题?
答案你正在使用env-> SetShortArrayRegion(sound, 0, soundLength, buf); 将数组sound复制到buf,不应该是env-> GetShortArrayRegion(sound, 0, soundLength, buf); 在这种情况下,你还需要分配buf,你目前只需要声明jshort *buf
或者只是使用
jshort* buf = env-> GetByteArrayElements(sound, NULL); if (buf != NULL) { G711::ALawEncode(dst, buf , (int)soundLength); env-> ReleaseByteArrayElements(sound, buf, JNI_ABORT); }


    推荐阅读