【问题标题】:appending values each time when calling JNI method每次调用 JNI 方法时附加值
【发布时间】:2016-11-10 07:08:34
【问题描述】:

我正在使用 JNI 来获取 apk 的签名,而且我做得很好。当我第一次从 java 调用这个方法时,我得到了确切的值。再次调用它,我得到具有精确值的附加值(例如 1234456123456)。 PFB 我正在使用的代码

char* getSignatureMd5(JNIEnv* env, jobject obj)
{
    char* sign = loadSignature(env, obj);
    MD5_CTX context = { 0 };
    MD5Init(&context);
    MD5Update(&context, (unsigned char*)sign, strlen(sign));
    unsigned char dest[16] = { 0 };
    MD5Final(dest, &context);
    int i;
    static char destination[32]={0};
    for (i = 0; i < 16; i++) {
            sprintf(destination, "%s%02x", destination, dest[i]);
    }
    return destination;
}

getToken JNI 方法

JNIEXPORT jstring JNICALL Java_com_sign_signaturecapturesbi_MyAdapter_getToken(JNIEnv *env, jobject obj)
                                                                     {
    char* signValue = getSignatureMd5(env, obj);
    __android_log_print(ANDROID_LOG_VERBOSE, "MyApp", "signValue %s", signValue);
    return (*env)->NewStringUTF(env, signValue);
    }

【问题讨论】:

    标签: android c android-ndk java-native-interface


    【解决方案1】:

    这些行会导致未定义的行为:

    for (i = 0; i < 16; i++) {
            sprintf(destination, "%s%02x", destination, dest[i]);
    }
    

    man 3 printf:

    C99 和 POSIX.1-2001 指定结果是未定义的,如果调用 到 sprintf()snprintf()vsprintf()vsnprintf() 会导致 复制发生在重叠的对象之间(例如,如果 目标字符串数组和提供的输入参数之一是指 相同的缓冲区)。

    此外,destinationstatic,因此它在调用之间保留其内容。这些点加在一起会给您带来如此奇怪的行为。

    由于dest 的大小是众所周知的,您可以简单地展开循环,也不要忘记在destination 中添加一个额外的单元格以终止\0。并且,如果可能的话,你应该使用snprintf()

    static char destination[33];
    
    snprintf(destination, sizeof destination,
        "%02x%02x%02x%02x%02x%02x%02x%02x"
        "%02x%02x%02x%02x%02x%02x%02x%02x",
        dest[0], dest[1], dest[2], dest[3],
        dest[4], dest[5], dest[6], dest[7],
        dest[8], dest[9], dest[10], dest[11],
        dest[12], dest[13], dest[14], dest[15]);
    

    在这种情况下,您可以将destination 保留为static,因为您的代码不再依赖其内容。但请注意,getSignatureMd5() 每次调用时都会返回指向同一个缓冲区的指针,因为后续调用会擦除先前调用获得的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-03
      • 2022-01-13
      • 2014-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-01
      相关资源
      最近更新 更多