【问题标题】:NDK general Segmentation fault, decStrong?NDK一般Segmentation fault,decStrong?
【发布时间】:2015-02-09 17:03:05
【问题描述】:

我在 android NDK 上遇到了一个非常奇怪的分段错误,但它并没有持续发生。我想问问你们的意见,如果没有,我会尝试将其报告为错误。

我在与执行 C 代码相关的应用程序上按下按钮。按钮和 C 代码有效,但我注意到多次按下后,出现分段错误:

01-05 19:36:08.723  27256-27267/com.example.developer.addc A/libc﹕ Fatal signal 11 (SIGSEGV) at 0xb8c80677 (code=1), thread 27267 (Binder_1)

我在 logcat 输出上使用 ndk-stack 运行了堆栈跟踪并看到了这个:

********** Crash dump: **********
Build fingerprint: 'samsung/klteuc/klteatt:4.4.2/KOT49H/G900AUCU1ANCE:user/release-keys'
pid: 28204, tid: 28217, name: Binder_2  >>> com.example.developer.addc <<< signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr b8dedddf
Stack frame #00  pc 0000d176  /system/lib/libutils.so(android::RefBase::decStrong(void const*) const+3)
Stack frame #01  pc 0001cfef  /system/lib/libbinder.so(android::IPCThreadState::processPendingDerefs()+82)
Stack frame #02  pc 0001db0f  /system/lib/libbinder.so (android::IPCThreadState::joinThreadPool(bool)+42)
Stack frame #03  pc 00021965  /system/lib/libbinder.soStack frame #04  pc0000ea5d  /system/lib/libutils.so (android::Thread::_threadLoop(void*)+216)
Stack frame #05  pc 00055f41  /system/lib/libandroid_runtime.so android::AndroidRuntime::javaThreadShell(void*)+68)
Stack frame #06  pc 0000e58f  /system/lib/libutils.so Stack frame #07  pc 0000d298  /system/lib/libc.so (__thread_entry+72)
Stack frame #08  pc 0000d430  /system/lib/libc.so (pthread_create+240)

虽然所需的按钮按下次数似乎是随机的,但此错误最终确实会发生。本机c代码为:

#include <jni.h>
#include <string.h>
#include <stdio.h>
#include <android/log.h>
#include "randomNumbers.h"
#define DEBUG_TAG "NDK_Tutorialapp"

jstring Java_com_example_developer_addc_MainActivity_getNumber(JNIEnv * env, jobject this, jint value1)

{
char *szFormat = "The random number is: %i";
char *randomResult;


int sum = randomness(value1);

randomResult = malloc(sizeof(szFormat) + 20);
jstring result;
if(randomResult!=NULL){
    sprintf(randomResult, szFormat, sum);
    result = (*env)->NewStringUTF(env, randomResult);
    free(randomResult);
}
return result;

}

并且随机性是一个随机数生成器,目前只是返回一个常数。

有熟悉这个问题的人吗?

【问题讨论】:

    标签: android c android-ndk segmentation-fault


    【解决方案1】:

    你确定在这里:

    randomResult = malloc(sizeof(szFormat) + 20);
    

    你分配了足够的内存吗? sizeof(szFormat) 将返回 4。

    还有什么是JNIEnv? 这个符号-&gt; 通常与指针一起使用,在您的情况下,您首先取消引用env,然后仍然应用-&gt;

    【讨论】:

    • JNIEnv 的使用方式至少是正确的——这就是您在 C 中调用 JNI 函数的方式。即,要在 C 中调用 JNI 函数,您使用 (*env)-&gt;DoFoo(env, params...),而您使用 env-&gt;DoFoo(params...)在 C++ 中。但是您对 sizeof 的评论是完全正确的。
    • @mstorsjo:我明白了。我对jni不熟悉。但是这里的使用方式,如果是双指针我会使用它..
    • 是的,在C模式下,JNIEnv本身被定义为指针类型,所以JNIEnv*实际上是一个双指针。让相同的虚拟表代码在 C(语法更冗长)和 C++(它适合作为普通 C++ 虚函数)中工作,这有点像预处理程序。
    • @mstorsjo:是的,查了一下,所以在 C++ 中它似乎只是指针
    • 谢谢@gio,好电话。我用 strlen 进行了更改,它似乎很稳定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 2016-05-31
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    相关资源
    最近更新 更多