当前位置:编程学习 > wap >>

求助,android调用jni导致程序无响应

最近在使用jni,主程序调用完jni方法后,过不多久就会报无响应强制退出的错误。经跟踪发现,本地C++代码中有这么一段话:

char *key = NULL;
jsize alen = env->GetArrayLength(arg_Key);
    jbyte* ba = env->GetByteArrayElements(arg_Key, JNI_FALSE);
if (alen > 0)
    {
        key = (char*)malloc(alen + 1);
        memcpy(key, ba, alen);
        key[alen] = 0;
    }
    env->ReleaseByteArrayElements(arg_Key, ba, 0);
    int keyLength = arg_KeyLength;
    char* hash = VerifyHash(fileData, key, keyLength);
    if (hash == NULL)
    {
        return NULL;
    }

其中VerifyHash方法出了问题,如果不调用这个方法就没有问题。该方法实现如下:

char* VerifyHash(char *content, const char *key, const int keyLength)
{
    int contentLength = strlen(content);
    // 加密
    vector<char> tmpContentAndKey;
    int newContentLength = 0;
    for (int i = 0; i < contentLength; i++)
    {
        if (i != 0 && i % 128 == 0)
        {
            // 注意去掉最后的'\0'
            for (int j = 0; j < keyLength; j++)
            {
                tmpContentAndKey.push_back(key[j]);
                newContentLength++;
            }
        }
        tmpContentAndKey.push_back(content);
        newContentLength++;
    }
    char* contentAndKey = new char[newContentLength];
    for (int i = 0; i < newContentLength; i++)
    {
        contentAndKey = tmpContentAndKey;
    }
  
    // 计算hash值
    const int len = 64;
    // 先要转换key
    char* newKey = new char[len];
    for (int i = 0; i < len; i++)
    {
        newKey = i < keyLength ? key : '\0';
    }
    int firstStepLength= len + newContentLength;
    char* firstStep = new char[firstStepLength];
    for (int i = 0; i < firstStepLength; i++)
    {
        firstStep = i < len ? (char) (newKey ^ 0x36) : contentAndKey[i - len];
    }
    // 计算sha1值
    SHA1Context shaA;
    SHA1Reset(&shaA);
    SHA1Input(&shaA, (const unsigned char *)firstStep, firstStepLength);
    if (!SHA1Result(&shaA))
    {
        __android_log_print(ANDROID_LOG_INFO, "VerifyHash", "ERROR-- could not compute message digest");
        return NULL;
    }
    char* sha1_FirstStep = new char[20];
    for (int i = 0; i < 5 ; i++)
    {
        sha1_FirstStep[i * 4] = (char)((shaA.Message_Digest >> 24) & 0xFF);
        sha1_FirstStep[i * 4 + 1] = (char)((shaA.Message_Digest >> 16) & 0xFF);
        sha1_FirstStep[i * 4 + 2] = (char)((shaA.Message_Digest >> 8) & 0xFF);
        sha1_FirstStep[i * 4 + 3] = (char)(shaA.Message_Digest & 0xFF);
    }
    sha1_FirstStep[20] = '\0';    // 保证sha1值只有20个字节;
    return sha1_FirstStep;
}

其实就是用于sha1加密的,其中sha1算法是网上找的开源算法,地址http://www.packetizer.com/security/sha1/。
结果就是程序能正常运行,计算后返给主程序的结果也没错,但只要一调jni方法,过一会主程序就报无响应,让强制退出。日志里也没报错。
跟了好几天,除了知道VerifyHash方法出问题之外,完全找不到原因。
求各位大大帮忙看看,这代码哪里出了问题?或者是附件的sha1算法哪里出了问题?
Android JNI SHA1 --------------------编程问答-------------------- 具体出错流程我详细解释一下。
首先,主程序正常运行,然后调用jni方法,jni方法返回给主程序值,此时主程序能收到返回值,依旧能正常运行。但调用结束后过不多久,主程序就无响应了。
如果注释掉C++代码中的VerifyHash方法,就不会出问题。
跟了好几天,除了知道VerifyHash方法出问题之外,完全找不到原因,不清楚为什么会主程序无响应。
--------------------编程问答-------------------- 计算量太大  导致ANR吧  
你另起线程计算这些东西试试 --------------------编程问答-------------------- 还有 你在/data/anr/traces.txt里可以看到是什么引起了anr  看下log再分析问题可能在哪里 --------------------编程问答--------------------
引用 2 楼 tanwei4199 的回复:
计算量太大  导致ANR吧  
你另起线程计算这些东西试试

已经计算完成了,也会是计算量的问题么?

引用 3 楼 tanwei4199 的回复:
还有 你在/data/anr/traces.txt里可以看到是什么引起了anr  看下log再分析问题可能在哪里

tarces.txt这个导出来了,不过看不懂。。 --------------------编程问答-------------------- 在新线程中调用jni方法,阻塞主线程才会导致ANR。 --------------------编程问答--------------------
引用 4 楼 Iceti9er 的回复:
Quote: 引用 2 楼 tanwei4199 的回复:

计算量太大  导致ANR吧  
你另起线程计算这些东西试试

已经计算完成了,也会是计算量的问题么?

引用 3 楼 tanwei4199 的回复:
还有 你在/data/anr/traces.txt里可以看到是什么引起了anr  看下log再分析问题可能在哪里

tarces.txt这个导出来了,不过看不懂。。

额  和异常信息差不多的  你贴出来大家帮忙分析下吧 --------------------编程问答--------------------
引用 5 楼 ameyume 的回复:
在新线程中调用jni方法,阻塞主线程才会导致ANR。

这个想过,不过主线程需要jni返回的信息才可以继续运行的,而且系统太庞大,要改造很困难。 --------------------编程问答--------------------
引用 6 楼 tanwei4199 的回复:
额  和异常信息差不多的  你贴出来大家帮忙分析下吧

一千多行。。都贴出来不现实啊。
不过换了个方法解决了问题,VerifyHash方法里不使用C写的开源的sha1程序,反调用Java提供的系统Sha1 API,就不会出问题了。
看来是C的sha1程序有问题,能正确算出值,可会导致主程序无响应,还是搞不明白原因。 --------------------编程问答--------------------
引用 8 楼 Iceti9er 的回复:
Quote: 引用 6 楼 tanwei4199 的回复:

额  和异常信息差不多的  你贴出来大家帮忙分析下吧

一千多行。。都贴出来不现实啊。
不过换了个方法解决了问题,VerifyHash方法里不使用C写的开源的sha1程序,反调用Java提供的系统Sha1 API,就不会出问题了。
看来是C的sha1程序有问题,能正确算出值,可会导致主程序无响应,还是搞不明白原因。

额  好吧  解决了就算了   不过anr信息即使是1000多行  你可以找出最近出的嘛   而且很好辨认  是不是你的应用出现的
补充:移动开发 ,  Android
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,