android ndk 开发获取应用包名以及keystroe签名信息
在做此操作之前,需要保证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方法了。如图。
到这里就大功告成了-。-