Skip to content

Instantly share code, notes, and snippets.

@b8x
Last active November 3, 2019 09:09
Show Gist options
  • Save b8x/0e9e33d933803ca5bbe7655ca9f46314 to your computer and use it in GitHub Desktop.
Save b8x/0e9e33d933803ca5bbe7655ca9f46314 to your computer and use it in GitHub Desktop.
Android native get signature (cpp)
#include <jni.h>
#include <string>
extern "C"
JNIEXPORT jstring JNICALL
Java_me_axaygadekar_security_NativeSecurity_getSignatureFromJNI(JNIEnv *env, jclass nativeSecurityClass,
jobject context) {
// --------------- PackageManager
// context object class
jclass contextClass = env->GetObjectClass(context);
// package manager method id
jmethodID getPackageManagerMethodId = env->GetMethodID(contextClass, "getPackageManager",
"()Landroid/content/pm/PackageManager;");
// package manager object
jobject packageManagerObject = env->CallObjectMethod(context, getPackageManagerMethodId);
// --------------- getting package name
// get package name method id
jmethodID getPackageNameMethodId = env->GetMethodID(contextClass, "getPackageName",
"()Ljava/lang/String;");
// get package name
jstring packageName = (jstring) env->CallObjectMethod(context, getPackageNameMethodId);
// --------------- getting package info
// package manager class
jclass packageManagerClass = env->GetObjectClass(packageManagerObject);
// get package info method id
jmethodID getPackageInfoMethodId = env->GetMethodID(packageManagerClass, "getPackageInfo",
"(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;");
jint flags = 0x00000040;
jobject packageInfo = env->CallObjectMethod(packageManagerObject, getPackageInfoMethodId,
packageName, flags);
// --------------- getting signatures
// get package info class
jclass packageInfoClass = env->GetObjectClass(packageInfo);
// get field id
jfieldID signaturesFieldId = env->GetFieldID(packageInfoClass, "signatures",
"[Landroid/content/pm/Signature;");
// get signatures objects
jobject signaturesObject = env->GetObjectField(packageInfo, signaturesFieldId);
jobjectArray signatures = reinterpret_cast<jobjectArray>(signaturesObject);
// --------------- getting signatures 0
// get signature
jobject signature = env->GetObjectArrayElement(signatures, 0);
jclass signatureClass = env->GetObjectClass(signature);
jmethodID toCharsStringMethodId = env->GetMethodID(signatureClass, "toCharsString",
"()Ljava/lang/String;");
jobject ts = env->CallObjectMethod(signature, toCharsStringMethodId);
return reinterpret_cast<jstring>(ts);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment