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方法了。如图。
到这里就大功告成了-。-
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方法了。如图。
到这里就大功告成了-。-
相关文章推荐
- Android 签名打包出现的错误的解决方法以及代码中获取应用签名信息方法
- Android如何查看应用签名信息以及加固后重新签名
- 微信开发笔记:获取用户openid,以及用户头像昵称等信息
- jni开发涨获取Java类的方法的Signature签名信息
- 微信公众号开发-微信网页授权获取用户openid以及用户信息的步骤
- 获取整机应用信息以及启动界面(通过adb启动应用)
- iOS开发获取设备唯一标识、系统版本、应用版本等信息
- AppCan移动开发技巧:3步走,获取移动APP签名信息
- ios开发中获取常用的应用与设备信息
- 【Android应用开发详解】第01期:第三方授权认证(一)实现第三方授权登录、分享以及获取用户资料
- 微信公众号开发获取openID以及用户详细信息,超详细步骤,亲测开发
- iOS 获取当前应用的信息以及用户信息:版本号手机号手机型号
- 【Android应用开发详解】第01期:第三方授权认证(一)实现第三方授权登录、分享以及获取用户资料
- 【Android应用开发详解】实现第三方授权登录、分享以及获取用户资料
- 【Android应用开发详解】第01期:第三方授权认证(一)实现第三方授权登录、分享以及获取用户资料
- Android开发之通过包管理器获取安装应用信息
- C#使用Xamarin开发可移植移动应用终章(11.获取设备信息与常用组件,开源一个可开发模版.)
- 获取android手机中已安装应用信息以及应用安装和卸载代码集合
- 微信公众号开发-微信网页授权获取用户openid以及用户信息的步骤
- Android开发之获取手机中已安装apk文件信息(PackageInfo、ResolveInfo)(应用图片、应用名、包名等)