Android 每次调用JNI方法时追加值

Android 每次调用JNI方法时追加值,android,c,android-ndk,java-native-interface,Android,C,Android Ndk,Java Native Interface,我正在使用一个JNI来获取apk的签名,而且我得到的非常好。当我第一次从java调用这个方法时,我得到了确切的值。再次调用它,我会得到精确值的附加值(例如1234456123456)。PFB我正在使用的代码 char* getSignatureMd5(JNIEnv* env, jobject obj) { char* sign = loadSignature(env, obj); MD5_CTX context = { 0 }; MD5Init(&context)

我正在使用一个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;
}

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

for (i = 0; i < 16; i++) {
        sprintf(destination, "%s%02x", destination, dest[i]);
}
在这种情况下,您可以将
destination
保留为
static
one,因为您的代码不再依赖于其内容。但请注意,
getSignatureMd5()
每次调用时都会返回指向同一缓冲区的指针,因为后续调用会擦除以前调用获得的结果

for (i = 0; i < 16; i++) {
        sprintf(destination, "%s%02x", destination, dest[i]);
}
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]);