求助,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再分析问题可能在哪里 --------------------编程问答--------------------
已经计算完成了,也会是计算量的问题么?
tarces.txt这个导出来了,不过看不懂。。 --------------------编程问答-------------------- 在新线程中调用jni方法,阻塞主线程才会导致ANR。 --------------------编程问答--------------------
额 和异常信息差不多的 你贴出来大家帮忙分析下吧 --------------------编程问答--------------------
在新线程中调用jni方法,阻塞主线程才会导致ANR。
这个想过,不过主线程需要jni返回的信息才可以继续运行的,而且系统太庞大,要改造很困难。 --------------------编程问答--------------------
额 和异常信息差不多的 你贴出来大家帮忙分析下吧
一千多行。。都贴出来不现实啊。
不过换了个方法解决了问题,VerifyHash方法里不使用C写的开源的sha1程序,反调用Java提供的系统Sha1 API,就不会出问题了。
看来是C的sha1程序有问题,能正确算出值,可会导致主程序无响应,还是搞不明白原因。 --------------------编程问答--------------------
额 和异常信息差不多的 你贴出来大家帮忙分析下吧
一千多行。。都贴出来不现实啊。
不过换了个方法解决了问题,VerifyHash方法里不使用C写的开源的sha1程序,反调用Java提供的系统Sha1 API,就不会出问题了。
看来是C的sha1程序有问题,能正确算出值,可会导致主程序无响应,还是搞不明白原因。
额 好吧 解决了就算了 不过anr信息即使是1000多行 你可以找出最近出的嘛 而且很好辨认 是不是你的应用出现的
补充:移动开发 , Android