Created
October 20, 2017 03:12
-
-
Save trongvu/57b693254326284f038b270f367b416d to your computer and use it in GitHub Desktop.
Utils class to get package name, signature in NDK
This file contains 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
// | |
// Created by vntrong on 10/20/2017. | |
// | |
#ifndef ANDROID_UTILS_H | |
#define ANDROID_UTILS_H | |
#include <jni.h> | |
#include <string.h> | |
#include <string> | |
#include <stdio.h> | |
#include <stdlib.h> | |
char *jstringTostring(JNIEnv *env, jstring jstr) { | |
char *rtn = NULL; | |
jclass clsstring = env->FindClass("java/lang/String"); | |
jstring strencode = env->NewStringUTF("utf-8"); | |
jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B"); | |
jbyteArray barr = (jbyteArray) env->CallObjectMethod(jstr, mid, strencode); | |
jsize alen = env->GetArrayLength(barr); | |
jbyte *ba = env->GetByteArrayElements(barr, JNI_FALSE); | |
if (alen > 0) { | |
rtn = (char *) malloc(alen + 1); | |
memcpy(rtn, ba, alen); | |
rtn[alen] = 0; | |
} | |
env->ReleaseByteArrayElements(barr, ba, 0); | |
return rtn; | |
} | |
char *getCallerPackageName(JNIEnv *env, jobject obj) { | |
jclass cls = env->FindClass("android/content/ContextWrapper"); | |
//this.getPackageManager(); | |
jmethodID mid = env->GetMethodID(cls, "getPackageManager", | |
"()Landroid/content/pm/PackageManager;"); | |
if (mid == NULL) { | |
return ""; | |
} | |
jobject pm = env->CallObjectMethod(obj, mid); | |
if (pm == NULL) { | |
return ""; | |
} | |
//this.getPackageName(); | |
mid = env->GetMethodID(cls, "getPackageName", "()Ljava/lang/String;"); | |
if (mid == NULL) { | |
return ""; | |
} | |
jstring packageName = (jstring) env->CallObjectMethod(obj, mid); | |
return jstringTostring(env, packageName); | |
} | |
char *getCallerSignature(JNIEnv *env, jobject obj) { | |
jclass cls = env->FindClass("android/content/ContextWrapper"); | |
//this.getPackageManager(); | |
jmethodID mid = env->GetMethodID(cls, "getPackageManager", | |
"()Landroid/content/pm/PackageManager;"); | |
if (mid == NULL) { | |
return ""; | |
} | |
jobject pm = env->CallObjectMethod(obj, mid); | |
if (pm == NULL) { | |
return ""; | |
} | |
//this.getPackageName(); | |
mid = env->GetMethodID(cls, "getPackageName", "()Ljava/lang/String;"); | |
if (mid == NULL) { | |
return ""; | |
} | |
jstring packageName = (jstring) env->CallObjectMethod(obj, mid); | |
// packageManager->getPackageInfo(packageName, GET_SIGNATURES); | |
cls = env->GetObjectClass(pm); | |
mid = env->GetMethodID(cls, "getPackageInfo", | |
"(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;"); | |
jobject packageInfo = env->CallObjectMethod(pm, mid, packageName, 0x40); //GET_SIGNATURES = 64; | |
cls = env->GetObjectClass(packageInfo); | |
jfieldID fid = env->GetFieldID(cls, "signatures", "[Landroid/content/pm/Signature;"); | |
jobjectArray signatures = (jobjectArray) env->GetObjectField(packageInfo, fid); | |
jobject sign = env->GetObjectArrayElement(signatures, 0); | |
cls = env->GetObjectClass(sign); | |
mid = env->GetMethodID(cls, "toCharsString", "()Ljava/lang/String;"); | |
if (mid == NULL) { | |
return ""; | |
} | |
jstring signString = (jstring) env->CallObjectMethod(sign, mid); | |
return jstringTostring(env, signString); | |
} | |
#endif //ANDROID_UTILS_H |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment