您的位置:首页 > 移动开发 > Android开发

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

2017-09-29 14:12 459 查看
在做此操作之前,需要保证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)

 
4000
  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方法了。如图。



到这里就大功告成了-。-
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐