首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从非UI线程调用时,使用致命信号11 (SIGSEGV)通过Android调用本机代码

从非UI线程调用时,使用致命信号11 (SIGSEGV)通过Android调用本机代码
EN

Stack Overflow用户
提问于 2014-08-26 10:21:08
回答 1查看 1.3K关注 0票数 0

我正在使用活动中的NDK调用我的本地C库。当从主UI线程调用时,一切正常(但UI被阻塞)。当从一个新线程(使用new Thread()创建或使用AsyncTask)调用时,它在logcat中出现"A/libc(32044):在0x77f1a000 (code=2)处的致命信号11 (SIGSEGV),线程32624 (线程-56564)“错误崩溃。

我在图书馆打了两个电话。第一个调用执行ok。第二个调用在GetByteArrayRegion语句上崩溃:

代码语言:javascript
复制
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并显示进度条。

任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-27 10:48:11

正如@BitBank正确指出的,bufferlen的声明没有分配内存,未分配的内存用于缓冲区(可能在堆栈上)。只有在使用不同的线程时,我才能看到这一点。改到

代码语言:javascript
复制
unsigned char *buffer;
buffer = malloc(len);
(*env)->GetByteArrayRegion(env, jBuffer, 0, len, buffer);
process_buffer(buffer);
free(buffer);

解决了这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25503436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档