Android JNI中C char *与Jstring转化引发的一次意外

最近到了研究所实习了,导师搞的也是移动安全开发,目测以后也是往这条路上走了。
入正题,昨天把openssl打包成arm能用的so库文件,今天试试能不能使用里面的函数,在使用一个md5的功能的时候,发生了一个问题,就是怎么都不能把生成的字符串传回给android上用,一开始所使用的C代码是如下写的

#include <stdio.h>
#include <string.h>
#include <openssl/md5.h>
#include <android/log.h>

char* md5(char in[]){
unsigned char out[20];
char temp[20];
char res[120];
size_t n;
int i;

n=strlen((const char*)in);
strcpy(res,"");
MD5(in,n,out);
for(i=0;i<16;i++)
{
sprintf(temp,"%02x",out[i]);
strcat(res,temp);
}
__android_log_write(ANDROID_LOG_INFO, in, res);
return res;
}

结果把值一传回去,全是乱码。。。然后各种百度各种google,看到那些人说什么jni中的Jstring和c中的char*不能单单靠NewStringUTF来转,结果找到各种转换函数,结果还是一样。
然后静下来,自己分析了一下,这C代码有问题。。。我居然文件给字符串分配内存,接着想到如果在这里用malloc分配内存后,担心android不会释放这段由C代码分出去的内存而导致内存泄漏,所我就这样写。

char* md5(char in[],char res){
unsigned char out[20];
char temp[20];
size_t n;
int i;

n=strlen((const char*)in);
strcpy(res,"");
MD5(in,n,out);
for(i=0;i<16;i++)
{
sprintf(temp,"%02x",out[i]);
strcat(res,temp);
}
__android_log_write(ANDROID_LOG_INFO, in, res);
return res;
}

结果,我原想避开的内存溢出错误被我完美地遇上,我瞬间虚了,不断地在C和JNI的代码上Log,最后在JNI代码处发现在释放第二个参数的时候(也就是 res ),居然出现了内存泄漏,想了想,应该是我在md5函数中改了这个传入参数而导致的,最后我只能试试在C上使用malloc了,我就这样写

char* md5(char in[]){
unsigned char out[20];
char temp[20];
char *res = (char*)malloc(sizeof(char)*120);
size_t n;
int i;

n=strlen((const char*)in);
strcpy(res,"");
MD5(in,n,out);
for(i=0;i<16;i++)
{
sprintf(temp,"%02x",out[i]);
strcat(res,temp);
}
__android_log_write(ANDROID_LOG_INFO, in, res);
return res;
}

结果没有内存泄露,看来之前的担心是多余的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值