我正在使用活动中的NDK调用我的本地C库。当从主UI线程调用时,一切正常(但UI被阻塞)。当从一个新线程(使用new Thread()创建或使用AsyncTask)调用时,它在logcat中出现"A/libc(32044):在0x77f1a000 (code=2)处的致命信号11 (SIGSEGV),线程32624 (线程-56564)“错误崩溃。
我在图书馆打了两个电话。第一个调用执行ok。第二个调用在GetByteArrayRegion语句上崩溃:
JNIEXPORT void JNICALL Java_com_mycompany_myproduct_library_process_data(JNIEnv *env, jobject obj, jbyteArray jBuffer) {
int len = (*env)->GetArrayLength(env, jBuffer);
unsigned char buffer[len];
(*env)->GetByteArrayRegion(env, jBuffer, 0, len, buffer); // crash
process_buffer(buffer);
}我试图在单独的线程中运行的原因是在执行过程中不阻塞UI并显示进度条。
任何帮助都是非常感谢的。
发布于 2014-08-27 10:48:11
正如@BitBank正确指出的,bufferlen的声明没有分配内存,未分配的内存用于缓冲区(可能在堆栈上)。只有在使用不同的线程时,我才能看到这一点。改到
unsigned char *buffer;
buffer = malloc(len);
(*env)->GetByteArrayRegion(env, jBuffer, 0, len, buffer);
process_buffer(buffer);
free(buffer);解决了这个问题。
https://stackoverflow.com/questions/25503436
复制相似问题