Call the java method in jni to obtain the md5 value of the signature file of the current apk.
Corresponding java method:
Void getsign (Context context) throws Exception {PackageInfo localPackageInfo = context. getPackageManager (). getPackageInfo (context. getPackageName (), 64); StringBuilder localStringBuilder = new StringBuilder (); Signature [] arrayOfSignature = localPackageInfo. signatures; Signature localSignature = arrayOfSignature [0]; MessageDigest localMessageDigest = MessageDigest. getInstance ("MD5"); localMessageDigest. update (localSignature. toByteArray (); // This is the md5 value of the signature String str2 = toHex (localMessageDigest. digest ();} private String toHex (byte [] paramArrayOfByte) {StringBuffer localStringBuffer = new StringBuffer (); for (int I = 0; I <paramArrayOfByte. length; I ++) {Object [] arrayOfObject = new Object [1]; arrayOfObject [0] = Byte. valueOf (paramArrayOfByte [I]); localStringBuffer. append (String. format ("% 02x", arrayOfObject);} return localStringBuffer. toString ();}
In jni, you can call the java method. Refer to the above java method to write the c code of jni:
// Byte Transfer to hexadecimal string // http://blog.csdn.net/pingd/article/details/41945417void ByteToHexStr (const unsigned char * source, char * dest, int sourceLen) {short I; unsigned char highByte, lowByte; for (I = 0; I <sourceLen; I ++) {highByte = source [I]> 4; lowByte = source [I] & 0x0f; highByte + = 0x30; if (highByte> 0x39) dest [I * 2] = highByte + 0x07; else dest [I * 2] = highByte; lowByte + = 0x30; if (lowByte> 0x39) dest [I * 2 + 1] = lowByte + 0x07; else dest [I * 2 + 1] = lowByte;} return;} JNIEXPORT jstring JNICALL Java_com_hengbao_util_DecodeUtil_test (JNIEnv * env, jobject thiz, jobject context) {// java code ========================================== ==================================/// PackageInfo localPackageInfo = context. getPackageManager ()//. getPackageInfo (context. getPackageName (), 64); // StringBuilder localStringBuilder = new StringBuilder (); // Signature [] arrayOfSignature = localPackageInfo. signatures; // Signature localSignature = arrayOfSignature [0]; // MessageDigest localMessageDigest = MessageDigest. getInstance ("MD5"); // localMessageDigest. update (localSignature. toByteArray (); // This is the md5 value of the signature // String str2 = toHex (localMessageDigest. digest (); // localStringBuilder. append ("Signature ")//. append (localPackageInfo. packageName ). append ('\ n '). append (str2); // System. out. println (localStringBuilder. toString (); // TextView TV = (TextView) findViewById (R. id. TV); // TV. setText (localStringBuilder. toString (); // private String toHex (byte [] paramArrayOfByte) {// StringBuffer localStringBuffer = new StringBuffer (); // for (int I = 0; I <paramArrayOfByte. length; I ++) {// Object [] arrayOfObject = new Object [1]; // arrayOfObject [0] = Byte. valueOf (paramArrayOfByte [I]); // localStringBuffer. append (String. format ("% 02x", arrayOfObject); //} // return localStringBuffer. toString (); //} // java code ========================================== ================================ jclass tem_class; jmethodID tem_method; jclass class_context = (* env)-> GetObjectClass (env, context); // PackageInfo localPackageInfo = context. getPackageManager ()//. getPackageInfo (context. getPackageName (), 64); tem_method = (* env)-> GetMethodID (env, class_context, "getPackageManager", "() Landroid/content/pm/PackageManager ;"); jobject identifier = (* env)-> CallObjectMethod (env, context, tem_method); // getPackageName tem_method = (* env)-> GetMethodID (env, class_context, "getPackageName ", "() Ljava/lang/String;"); jobject obj_package_name = (* env)-> CallObjectMethod (env, context, tem_method); // getPackageInfo tem_class = (* env) -> GetObjectClass (env, obj_package_manager); tem_method = (* env)-> GetMethodID (env, tem_class, "getPackageInfo", "(Ljava/lang/String; I) landroid/content/pm/PackageInfo; "); jobject obj_package_info = (* env)-> CallObjectMethod (env, obj_package_manager, tem_method, obj_package_name, 64 ); // Signature [] arrayOfSignature = localPackageInfo. signatures; // Signature localSignature = arrayOfSignature [0]; tem_class = (* env)-> GetObjectClass (env, callback); jfieldID fieldID_signatures = (* env)-> GetFieldID (env, tem_class, "signatures", "[Landroid/content/pm/Signature;"); jobjectArray signatures = (* env)-> GetObjectField (env, obj_package_info, fieldID_signatures ); jobject signature = (* env)-> GetObjectArrayElement (env, signatures, 0); // localSignature. toByteArray () tem_class = (* env)-> GetObjectClass (env, signature); tem_method = (* env)-> GetMethodID (env, tem_class, "toByteArray ","() [B "); jobject obj_sign_byte_array = (* env)-> CallObjectMethod (env, signature, tem_method); // The obtained signature byte array // MessageDigest localMessageDigest = MessageDigest. getInstance ("MD5"); jclass class_MessageDigest = (* env)-> FindClass (env, "java/security/MessageDigest"); tem_method = (* env) -> GetStaticMethodID (env, class_MessageDigest, "getInstance", "(Ljava/lang/String;) Ljava/security/MessageDigest;"); jobject obj_md5 = (* env) -> CallStaticObjectMethod (env, class_MessageDigest, tem_method, (* env)-> NewStringUTF (env, "md5"); // localMessageDigest. update (localSignature. toByteArray (); // tem_class = (* env)-> GetObjectClass (env, obj_md5); tem_method = (* env)-> GetMethodID (env, class_MessageDigest, "update ", "([B) V"); // the return value of this function is void, write V (* env)-> CallVoidMethod (env, obj_md5, tem_method, obj_sign_byte_array ); // localMessageDigest. digest () tem_method = (* env)-> GetMethodID (env, class_MessageDigest, "digest", "() [B"); // This is the byte array after md5, now, you only need to convert it into a hexadecimal string, and you can compare it with the previous jobject obj_array_sign = (* env)-> CallObjectMethod (env, obj_md5, tem_method ); // does jni have the concept of strong Conversion Type? // This is the md5 value of the signature // String str2 = toHex (localMessageDigest. digest (); // try to write in c: http://blog.csdn.net/pingd/article/details/41945417 jsize int_array_length = (* env)-> GetArrayLength (env, obj_array_sign); jbyte * byte_array_elements = (* env) -> GetByteArrayElements (env, obj_array_sign, JNI_FALSE); char * char_result = (char *) malloc (int_array_length * 2 + 1); // start with no + 1, in some cases, it may cause problems out of the Boundary. It is better to add \ 0 later. // convert the byte array to a hexadecimal string. We don't need to perform a strong conversion here, jbyte and unsigned char should have the same ByteToHexStr (byte_array_elements, char_result, int_array_length); * (char_result + int_array_length * 2) = '\ 0 '; // Add \ 0 jstring string_result = (* env)-> NewStringUTF (env, char_result); // release (* env)-> constraint (env, obj_array_sign, byte_array_elements, JNI_ABORT); // release the pointer using free (char_result); return string_result; // It should be fine if java's hexadecimal conversion is used, writing hexadecimal conversions in c is too troublesome // jclass class_HandleData = (* env)-> FindClass (env, "com/hengbao/util/HandleData "); // tem_method = (* env)-> GetStaticMethodID (env, class_HandleData, "bytesToHexString1", "([B) Ljava/lang/String ;"); // jobject obj_result = (* env)-> CallStaticObjectMethod (env, class_HandleData, tem_method, obj_array_sign); // return obj_result ;}