JNI 字符串处理乱码问题jstring to char

用到了C语言AES加解密,代码是从Linux内核提取的;原代码的key是:

const char *key_string="1234567890123";

实际使用要对key做处理,通过java端传进来的jstring:

const char *key_str=(*env)->GetStringUTFChars(env, jkey, 0);

用key_string加解密是没问题的,用key_str加密ok,解密就会出现乱码错误;所以怀疑是转换除了问题;
C语言的字符串比较复杂,有些不理解。

对比了二个字符串:

1. strcmp(key_string, key_str) 返回 02. strlen(key_string)=13, sizeof(key_string)=4 
3. strlen(key_str)=13, sizeof(key_str)=4

求SF大神指点!

附上源码:

jstring  
Java_com_itapp_mylibrary_MyLibrary_encrity(JNIEnv* env, jobject this,jstring jstr,jstring jkey)
{
    const char *key_string="1234567890123"; 
    
    //1. 将unicode编码的java字符串转换成C风格字符串
    const char *key_str=(*env)->GetStringUTFChars(env, jkey, 0);
    
    LOGI("setAES----key_string:%s,key_str:%s,key_string:%d",key_string,key_str,strcmp(key_string, key_str));

    LOGI("strlen(key_string)=%d, sizeof(key_string)=%d", strlen(key_string), sizeof(key_string));
    LOGI("strlen(key_str)=%d, sizeof(key_str)=%d", strlen(key_str), sizeof(key_str));
    //2. 释放内存
    (*env)->ReleaseStringUTFChars(env, jkey, key_str);
    
    const char *str_input = (*env)->GetStringUTFChars(env, jstr, NULL);        //待加密内容,转换格式
    long strLen = ((strlen(str_input) / 16) * 16) + 16;                //计算该给字符串的长度  (字符长度/16)*16+16  以确保长度为16的倍数

    
    //开始AES加密
    char * aesEnc = malloc(strLen);
    
    memset(aesEnc, 0, strLen);
    AES_set_encrypt_key(key_string, 256, &key);                                    //设置AES加密密钥
    for (i = 0; i < strlen(str_input); i += 16)AES_encrypt(str_input + i, aesEnc + i, &key);    //循环进行AES加密

    //开始Base64一次加密
    char *basEnc = base64_encode(aesEnc, strlen(aesEnc));    //Base64加密

    //拼接长度到 加密字符               在加密内容后拼接     原字符串长度
    char len[strLen+2];
    sprintf(len,"%d__",strLen);
    char *len_str = str_contact(len,basEnc);

    //进行Base64二次加密
    char *result = base64_encode(len_str, strlen(len_str));    //Base64加密

    LOGI("setAES----result:%s", result);
    //转换为 jstring 并返回
    return (*env)->NewStringUTF(env, result);
    
}
 jstring  
Java_com_itapp_mylibrary_MyLibrary_decrity(JNIEnv* env, jobject this,jstring jstr,jstring jkey)
{
    char *key_string="1234567890123"; 

    //1. 将unicode编码的java字符串转换成C风格字符串
    const char *key_str=(*env)->GetStringUTFChars(env, jkey, 0);

    //2. 释放内存
    (*env)->ReleaseStringUTFChars(env, jkey, key_str);
  
    const char *str_output = (*env)->GetStringUTFChars(env, jstr, NULL);    //获取待揭秘内容,转换格式

    //进行Base64一次解密
    char *len_str = base64_decode(str_output, strlen(str_output));   //Base64解密,解密basEnc,得basDec

    //分割字符串
    char str[strlen(len_str)];     //原始字符串
    char cstrlen[16];            //源字符串长度
    sscanf(len_str, "%[0-9]__%[^.]", cstrlen,str);      //获取字符串内容
    long strLen = atoi(cstrlen);    //截取字符串原长度

    //进行Base64二次解密
    char *basDec = base64_decode(str, strlen(str));   //Base64解密,解密basEnc,得basDec

    //进行AES解密
    char * aesDec = malloc(strLen);    
    memset(aesDec, 0, strLen);
    AES_set_decrypt_key(key_string,256,&key);           //设置AES解密密钥
    for(i=0;i<strLen;i+=16)AES_decrypt(basDec+i,aesDec+i,&key);         //进行AES解密,解密basDec,得aesDec
    
    LOGI("getAES----aesDec:%s", aesDec);
    //转换为 jstring 并返回
    return (*env)->NewStringUTF(env, aesDec);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值