Android 每次调用JNI方法时追加值
我正在使用一个JNI来获取apk的签名,而且我得到的非常好。当我第一次从java调用这个方法时,我得到了确切的值。再次调用它,我会得到精确值的附加值(例如1234456123456)。PFB我正在使用的代码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)
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]);