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

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

1.定义native java 类

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

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

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

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

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

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

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

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

4,在jni文件夹下创建.c 文件,引入刚才放进来的.h头文件,开始写获取自己的代码逻辑android ndk 开发获取应用包名以及keystroe签名信息

获取包名代码如下:

    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,到这里就写完了,然后开始编译

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

编译完成后:android ndk 开发获取应用包名以及keystroe签名信息

然后将这几个so库放入 工程 libs下android ndk 开发获取应用包名以及keystroe签名信息

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

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

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