jni 获取 应用 签名

jobject getApplication(JNIEnv *env) {
    jclass localClass = env->FindClass("android/app/ActivityThread");
    if (localClass != NULL) {
        jmethodID getapplication = env->GetStaticMethodID(localClass, "currentApplication",
                                                          "()Landroid/app/Application;");
        if (getapplication != NULL) {
            jobject application = env->CallStaticObjectMethod(localClass, getapplication);
            return application;
        }
        return NULL;
    }
    return NULL;
}
void checkSign(JNIEnv *env ){

    jobject context= getApplication(env);
    jclass  activity = env->GetObjectClass(context);

// 得到 getPackageManager 方法的 ID
    jmethodID methodID_func = env->GetMethodID(activity, "getPackageManager", "()Landroid/content/pm/PackageManager;");
    // 获得PackageManager对象
    jobject packageManager = env->CallObjectMethod(context,methodID_func);
    jclass packageManagerclass = env->GetObjectClass(packageManager);
    //得到 getPackageName 方法的 ID
    jmethodID methodID_pack = env->GetMethodID(activity,"getPackageName", "()Ljava/lang/String;");
    //获取包名
    jstring name_str = static_cast<jstring>(env->CallObjectMethod(context, methodID_pack));
    // 得到 getPackageInfo 方法的 ID
    jmethodID methodID_pm = env->GetMethodID(packageManagerclass,"getPackageInfo", "(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;");
    // 获得应用包的信息
    jobject package_info = env->CallObjectMethod(packageManager, methodID_pm, name_str, 64);
    // 获得 PackageInfo 类
    jclass package_infoclass = env->GetObjectClass(package_info);
    // 获得签名数组属性的 ID
    jfieldID fieldID_signatures = env->GetFieldID(package_infoclass,"signatures", "[Landroid/content/pm/Signature;");
    // 得到签名数组,待修改
    jobject signatur = env->GetObjectField(package_info, fieldID_signatures);
    jobjectArray  signatures = reinterpret_cast<jobjectArray>(signatur);
    jobject signature = env->GetObjectArrayElement(signatures, 0);
    // localSignature.toByteArray()
    jclass tem_class;
    jmethodID tem_method;

    tem_class = env->GetObjectClass(signature);
    tem_method = env->GetMethodID(tem_class, "toByteArray", "()[B");
    jobject obj_sign_byte_array = env->CallObjectMethod(signature, tem_method);// 这个就是拿到的签名byte数组


    char *pmsg = ConvertJByteaArrayToChars(env,
                                           static_cast<jbyteArray>(obj_sign_byte_array));

    int len =   env->GetArrayLength(static_cast<jbyteArray>(obj_sign_byte_array));

    string hexstr =  dump_block(pmsg,len);
    LOGI("self toByteArray:len %d %s ",hexstr.length(), hexstr.c_str() );


}
char* ConvertJByteaArrayToChars(JNIEnv *env, jbyteArray bytearray)
{
     char *chars = NULL;
     jbyte *bytes;
     bytes = env->GetByteArrayElements(bytearray, 0);
     int chars_len = env->GetArrayLength(bytearray);
     chars = new char[chars_len + 1];
     memset(chars,0,chars_len + 1);
     memcpy(chars, bytes, chars_len);
     chars[chars_len] = 0;

     env->ReleaseByteArrayElements(bytearray, bytes, 0);

     return chars;
}

 

string dump_block(const char* aInStr,int len) {
    const char HEX[] = "0123456789ABCDEF";

    std::string lStr;
    for (int i = 0; i < len; i++) {
        char lTemp = aInStr[i];
        lStr.push_back(HEX[lTemp / 16]);
        lStr.push_back(HEX[lTemp % 16]);
    }
    return lStr;

}

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值