Java获取方法:
private void getCertificateMD5() {
try {
String packageName = getApplicationContext().getPackageName();
PackageInfo packageInfo = getApplicationContext().getPackageManager().getPackageInfo(
packageName, PackageManager.GET_SIGNATURES);
Signature[] signs = packageInfo.signatures;
Signature sign = signs[0];
byte[] cert = sign.toByteArray();
String md5 = getMD5(cert);
Log.e(TAG, "md5 = " + md5);
} catch (Exception e) {
e.printStackTrace();
}
}
jni获取方法:
static int getApkSignature(JNIEnv *jniEnv,
jobject context,
uint8_t *signatureBuffer,
uint signatureBufferLen) {
if (NULL == jniEnv || NULL == context || NULL == signatureBuffer || signatureBufferLen < 64) {
return -1;
}
JNIEnv env = *jniEnv;
// context.getPackageManager()
jclass context_class = env->GetObjectClass(jniEnv, context);
jmethodID getPackageManager = env->GetMethodID(jniEnv,
context_class,
"getPackageManager",
"()Landroid/content/pm/PackageManager;");
jobject packageManager = env->CallObjectMethod(jniEnv, context, getPackageManager);
// context.getPackageName()
jmethodID getPackageName = env->GetMethodID(jniEnv,
context_class,
"getPackageName",
"()Ljava/lang/String;");
jstring packageName = (jstring)env->CallObjectMethod(jniEnv,
context,
getPackageName);
// packageManager->getPackageInfo(packageName, GET_SIGNATURES);
jclass package_manager_clazz = env->GetObjectClass(jniEnv, packageManager);
jmethodID getPackageInfo = env->GetMethodID(jniEnv,
package_manager_clazz,
"getPackageInfo",
"(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;");
jint flags = 0x00000040;
jobject packageInfo = env->CallObjectMethod(jniEnv,
packageManager,
getPackageInfo, packageName, flags);
jthrowable exception = env->ExceptionOccurred(jniEnv);
env->ExceptionClear(jniEnv);
if (exception) {
return -1;
}
// packageInfo.signatures[0]
jclass package_info_clazz = env->GetObjectClass(jniEnv, packageInfo);
jfieldID fid = env->GetFieldID(jniEnv,
package_info_clazz,
"signatures",
"[Landroid/content/pm/Signature;");
jobjectArray signatures = (jobjectArray)env->GetObjectField(jniEnv, packageInfo, fid);
jobject signature = env->GetObjectArrayElement(jniEnv, signatures, 0);
// signature.toByteArray()
jclass signature_clazz = env->GetObjectClass(jniEnv, signature);
jmethodID signature_toByteArray = env->GetMethodID(jniEnv,
signature_clazz,
"toByteArray", "()[B");
jbyteArray sig_bytes = (jbyteArray)env->CallObjectMethod(jniEnv,
signature,
signature_toByteArray);
/// get byte buffer
jbyte *buffer = (jbyte *)env->GetByteArrayElements(jniEnv, sig_bytes, NULL);
jint bufferLen = env->GetArrayLength(jniEnv, sig_bytes);
if (NULL != buffer) {
uint8_t result[16] = {0};
if (0 == md5((uint8_t *)buffer, (size_t)bufferLen, result)) {
return byteToHex(result, 16, signatureBuffer, signatureBufferLen);
}
}
return -1;
}
jni调用java方法,通过实例化的对象,找到类Class, 再通过Class找到方法ID,最后调用方法ID