android ndk 开发获取应用包名以及keystroe签名信息

本文介绍如何使用JNI技术从Android应用中获取应用包名及签名信息,包括定义Java类、编译JNI头文件、编写C/C++逻辑代码并最终在Java层调用的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在做此操作之前,需要保证ndk环境以配置完成,并对jni的语法有一定的了解。

1.定义native java 类


这里的InfoJni  是在app  build 文件中配置的moduleName 保持一致


2.通过jni 编译成.h 文件

首先Terminal 进入到 java 文件夹下 ,然后运行命令—>: javah -encoding utf-8 -jni com.mvp.cn.jni.JNIUtil


3.将刚刚编译玩的头文件放入新建的jni文件夹下


4,在jni文件夹下创建.c 文件,引入刚才放进来的.h头文件,开始写获取自己的代码逻辑

获取包名代码如下:

    jclass contextClass = (jclass)(*env)->NewGlobalRef(env,(*env)->FindClass(env,"android/content/Context"));
    jmethodID getPackageNameId = (*env)->GetMethodID(env,contextClass, "getPackageName","()Ljava/lang/String;");
    jstring packNameString =  (jstring)(*env)->CallObjectMethod(env,contextObject, getPackageNameId);
    return packNameString;

获取应用签名信息代码如下:

jclass context_class = (*env)->GetObjectClass(env,context_object);
    //context.getPackageManager()
    jmethodID methodId = (*env)->GetMethodID(env,context_class, "getPackageManager", "()Landroid/content/pm/PackageManager;");
    jobject package_manager_object = (*env)->CallObjectMethod(env,context_object, methodId);
    if (package_manager_object == NULL) {
//        __android_log_print(ANDROID_LOG_INFO, "JNITag","getPackageManager() Failed!");
        return NULL;
    }


    //context.getPackageName()
    methodId = (*env)->GetMethodID(env,context_class, "getPackageName", "()Ljava/lang/String;");
    jstring package_name_string = (jstring)(*env)->CallObjectMethod(env,context_object, methodId);
    if (package_name_string == NULL) {
//        __android_log_print(ANDROID_LOG_INFO, "JNITag","getPackageName() Failed!");
        return NULL;
    }


    (*env)->DeleteLocalRef(env,context_class);


    //PackageManager.getPackageInfo(Sting, int)
    jclass pack_manager_class = (*env)->GetObjectClass(env,package_manager_object);
    methodId = (*env)->GetMethodID(env,pack_manager_class, "getPackageInfo", "(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;");
    (*env)->DeleteLocalRef(env,pack_manager_class);
    jobject package_info_object = (*env)->CallObjectMethod(env,package_manager_object, methodId, package_name_string, 64);
    if (package_info_object == NULL) {
//        __android_log_print(ANDROID_LOG_INFO, "JNITag","getPackageInfo() Failed!");
        return NULL;
    }


    (*env)->DeleteLocalRef(env,package_manager_object);


    //PackageInfo.signatures[0]
    jclass package_info_class = (*env)->GetObjectClass(env,package_info_object);
    jfieldID fieldId = (*env)->GetFieldID(env,package_info_class, "signatures", "[Landroid/content/pm/Signature;");
    (*env)->DeleteLocalRef(env,package_info_class);
    jobjectArray signature_object_array = (jobjectArray)(*env)->GetObjectField(env,package_info_object, fieldId);
    if (signature_object_array == NULL) {
//        __android_log_print(ANDROID_LOG_INFO, "JNITag","PackageInfo.signatures[] is null");
        return NULL;
    }
    jobject signature_object = (*env)->GetObjectArrayElement(env,signature_object_array, 0);


    (*env)->DeleteLocalRef(env,package_info_object);


    //Signature.toCharsString()
    jclass signature_class = (*env)->GetObjectClass(env,signature_object);
    methodId = (*env)->GetMethodID(env,signature_class, "toCharsString", "()Ljava/lang/String;");
    (*env)->DeleteLocalRef(env,signature_class);
    jstring signature_string = (jstring)(*env)->CallObjectMethod(env,signature_object, methodId);
    return signature_string;

5,到这里就写完了,然后开始编译

编译完成后:

然后将这几个so库放入 工程 libs下

然后在activity 中就可以调用刚才定义的native方法了。如图。


到这里就大功告成了-。-


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值