Skip to content

Instantly share code, notes, and snippets.

@trongvu
Created October 20, 2017 03:12
Show Gist options
  • Save trongvu/57b693254326284f038b270f367b416d to your computer and use it in GitHub Desktop.
Save trongvu/57b693254326284f038b270f367b416d to your computer and use it in GitHub Desktop.
Utils class to get package name, signature in NDK
//
// 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