Created
February 12, 2019 11:27
-
-
Save ccentauri/a613a7e2f319aec01d184739ab9469fe to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
jobject getContext(JNIEnv *env) { | |
jclass jAppAppGlobalsClass = env->FindClass("android/app/AppGlobals"); | |
jmethodID jGetInitialApplication = env->GetStaticMethodID(jAppAppGlobalsClass, "getInitialApplication", | |
"()Landroid/app/Application;"); | |
jobject jApplicationObject = env->CallStaticObjectMethod(jAppAppGlobalsClass, jGetInitialApplication); | |
return jApplicationObject; | |
} | |
/** | |
* | |
* @param env - JNIEnv instance, shared to the whole application | |
* @return | |
*/ | |
const char *getSignature(JNIEnv *env) { | |
jobject thiz = getContext(env); | |
// Context | |
jclass native_context = env->FindClass("android/content/Context"); | |
// Context#getPackageManager() | |
jmethodID methodID_func = env->GetMethodID(native_context, "getPackageManager", "()Landroid/content/pm/PackageManager;"); | |
jobject package_manager = env->CallObjectMethod(thiz, methodID_func); | |
jclass pm_clazz = env->GetObjectClass(package_manager); | |
// PackageManager#getPackageInfo() | |
jmethodID methodId_pm = env->GetMethodID(pm_clazz, "getPackageInfo", "(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;"); | |
// Context#getPackageName() | |
jmethodID methodID_packagename = env->GetMethodID(native_context, "getPackageName", "()Ljava/lang/String;"); | |
jstring name_str = static_cast<jstring>(env->CallObjectMethod(thiz, methodID_packagename)); | |
jobject package_info = env->CallObjectMethod(package_manager, methodId_pm, name_str, 64); | |
jclass pi_clazz = env->GetObjectClass(package_info); | |
// PackageInfo#signatures | |
jfieldID fieldID_signatures = env->GetFieldID(pi_clazz, "signatures", "[Landroid/content/pm/Signature;"); | |
jobject signatur = env->GetObjectField(package_info, fieldID_signatures); | |
jobjectArray signatures = reinterpret_cast<jobjectArray>(signatur); | |
// PackageInfo#signatures[0] | |
jobject signature = env->GetObjectArrayElement(signatures, 0); | |
jclass s_clazz = env->GetObjectClass(signature); | |
// PackageInfo#signatures[0].toCharString() | |
jmethodID methodId_ts = env->GetMethodID(s_clazz, "toCharsString", "()Ljava/lang/String;"); | |
jstring ts = (jstring) env->CallObjectMethod(signature, methodId_ts); | |
return env->GetStringUTFChars(ts, 0); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I am new to jni.. how to call this from a class of android?