我在androidJNI C层中编写了一个字符串转换函数它可以在调试下正确运行当我将其压缩为APK文件时它无法运行

问题描述

我在android JNI C层中编写了一个字符串转换函数。它可以在调试下正确运行。当我将其压缩为APK文件时。它无法运行。并报告错误,我不知道问题出在哪里。在JNI层没有混淆。当我不调用函数时,apk可以正常运行。否则,此功能只能在调试模式下正常运行

char *ove(char *str,size_t len) {

    char *start = str;
    char *end = str + len - 1;
    char ch;

    if (str != NULL) {
        while (start < end) {
            ch = *start;
            *start++ = *end;
            *end-- = ch;
        }
    }
    return str;
}
char test(char *msg) {
    char letter[] = "ABCDEFGHIJ";
    char number[] = "0123456789";
    char *data = ove(msg,strlen(msg));
    for (int i = 0; i < strlen(data); i++) {
        char a = data[i];
        for (int j = 0; j < strlen(letter); j++) {
            char b = letter[j];
            char c = number[j];
            if (isalpha(a) != 0) {
                if (strcmp(&a,&b) == 0) {
                    sprintf(cryptograph,"%s%s",cryptograph,&c);
                    break;
                }
            } else {
                if (strcmp(&a,&c) == 0) {
                    sprintf(cryptograph,&b);
                    break;
                }
            }
        }
    }
    LOGE("JNILOG_%s",cryptograph)
}

这是错误消息

#06 pc 00000000002ea530  /system/lib64/libart.so (art::JavaVMExt::LoadNativeLibrary(_jnienv*,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,_jobject*,std::__1::allocator<char>>*)+3192)
#43 pc 00000000003f0c24  /system/lib64/libart.so (art::Method_invoke(_jnienv*,_jobjectArray*)+52)
#51 pc 0000000000363748  /system/lib64/libart.so (art::JNI::CallStaticVoidMethodV(_jnienv*,_jclass*,_jmethodID*,std::__va_list)+652)
#52 pc 00000000000bd920  /system/lib64/libandroid_runtime.so (_jnienv::CallStaticVoidMethod(_jclass*,...)+116)

解决方法

正如我的评论中提到的那样,这段代码使C数组和字符混乱。

您至少需要更改以下内容:

  • strcmp(&a,&b) == 0应该是a == b
  • sprintf(cryptograph,"%s%s",cryptograph,&c);应该是sprintf(cryptograph,"%s%c",c);或仅仅是cryptograph[i+x] = c;(其中x是函数开头的密码长度)