盛年不重来,一日难再晨,及时当勉励,岁月不待人。这篇文章主要讲述原生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);
}
推荐阅读
- 如果我有32位本机库,Android应用程序仍然是64位吗()
- 如何在没有Android Studio的情况下编译JNI共享库,并在[关闭]中编译依赖项
- Android JNI(将cv :: Mat转换为jbyteArray)
- 如何在Android模拟器上显示Mat图像(使用NDK)
- 当SDL_init()时,FFmpeg2.3.3和SDL2-2.0.3的Android Media播放器出错。错误是关于SDL_main.h
- 使用Android Studio调试C ++库
- 如何将http C库正确包含到Android项目中()
- 如何调查随机Android原生函数调用错误()
- 从Android Activity onCreate方法调用QCoreApplication方法