Call the java method in jni to obtain the md5 value of the signature file of the current apk.

Source: Internet
Author: User

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 ;}

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.