Android NDK几点回调方式
来源:互联网 发布:软件测试入门书籍 编辑:程序博客网 时间:2024/05/21 03:18
Android NDK几点回调方式
分类: Android 2014-09-01 21:44 531人阅读 评论(0)收藏 举报
androidndk
目录(?)[+]
- 一NDK中获取android设备ID的方式
- 二通过NDK获取证书签名
原文dellinger:http://www.cnblogs.com/dellinger/p/3454996.html
一、NDK中获取android设备ID的方式
Java代码如下(获取设备ANDROID_ID):
final String androidId = Secure.getString(context.getContentResolver(), Secure.ANDROID_ID);
对应的c代码(相当蛋疼),注意如果是C++,需要把所有的(*env)->替换成env->,同时去掉第一个参数env
char *get_android_id(JNIEnv *env, jobject mContext, jobject actObj){ char *szDevId = NULL; if (!mContext) { return szDevId; } jclass resCls = (*env)->FindClass(env, "android/content/Context"); jmethodID getMethod = (*env)->GetMethodID(env, resCls, "getContentResolver", "()Landroid/content/ContentResolver;"); jobject resolver = (*env)->CallObjectMethod(env, actObj, getMethod); if (resolver == NULL) { LOGE("Invalid resolver!"); } jclass cls_context = (*env)->FindClass(env, "android/provider/Settings$Secure"); if (cls_context == NULL) { LOGE("Invalid cls_context!"); } jmethodID getStringMethod = (*env)->GetStaticMethodID(env, cls_context, "getString", "(Landroid/content/ContentResolver;Ljava/lang/String;)Ljava/lang/String;"); if (getStringMethod == NULL) { LOGE("Invalid getStringMethod!"); } jfieldID ANDROID_ID = (*env)->GetStaticFieldID(env, cls_context, "ANDROID_ID", "Ljava/lang/String;"); jstring str = (jstring)((*env)->GetStaticObjectField(env, cls_context, ANDROID_ID)); jstring jId = (jstring)((*env)->CallStaticObjectMethod(env, cls_context, getStringMethod, resolver, str)); szDevId = (char *)((*env)->GetStringUTFChars(env, jId, 0)); return szDevId;}
如果是手机,还可以通过TelephoneManager.getDeviceId()方式来获取:
Java代码:
final String deviceId = ((TelephonyManager) context.getSystemService( Context.TELEPHONY_SERVICE )).getDeviceId();
对应的C代码:
char *get_telepone_id(JNIEnv *env, jobject mContext, jobject actObj) { char *szDevId = NULL; if(mContext == 0){ return szDevId; } jclass cls_context = (*env)->FindClass(env, "android/content/Context"); jmethodID getSystemService = (*env)->GetMethodID(env, cls_context, "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;"); if(!getSystemService){ return szDevId; } jfieldID TELEPHONY_SERVICE = (*env)->GetStaticFieldID(env, cls_context, "TELEPHONY_SERVICE", "Ljava/lang/String;"); if(!TELEPHONY_SERVICE){ return szDevId; } jstring str = (jstring)(*env)->GetStaticObjectField(env, cls_context, TELEPHONY_SERVICE); jclass cls_tm = (*env)->FindClass(env, "android/telephony/TelephonyManager"); if(!cls_tm){ return szDevId; } jobject telephonymanager = (*env)->CallObjectMethod(env, actObj, getSystemService, str); if(!telephonymanager){ return szDevId; } jmethodID getDeviceId = (*env)->GetMethodID(env, cls_tm, "getDeviceId", "()Ljava/lang/String;"); if(!getDeviceId){ return szDevId; } jstring deviceid = (jstring)(*env)->CallObjectMethod(env, telephonymanager, getDeviceId); szDevId = (char *)(*env)->GetStringUTFChars(env, deviceid, 0); (*env)->DeleteLocalRef(env, cls_tm); (*env)->DeleteLocalRef(env, cls_context); (*env)->DeleteLocalRef(env, telephonymanager); return szDevId;}
二、通过NDK获取证书签名
Java代码:
PackageInfo pis;try { pis = mContext.getPackageManager().getPackageInfo(packageName, PackageManager.GET_SIGNATURES); //获取包信息 Signature sigs = pis.signatures[0]; //获取签名 int hash = sigs.hashCode(); //获取签名的哈希码} catch(Exception e) { //TODO:log here.}
对应的C代码:
intget_apk_signature(JNIEnv *env, jobject obj) { jclass cls = (*env)->FindClass(env, "android/content/ContextWrapper"); //this.getPackageManager(); jmethodID mid = (*env)->GetMethodID(env, cls, "getPackageManager", "()Landroid/content/pm/PackageManager;"); if (mid == NULL) { return -1; } jobject pm = (*env)->CallObjectMethod(env, obj, mid); if (pm == NULL) { return -2; } //this.getPackageName(); mid = (*env)->GetMethodID(env, cls, "getPackageName", "()Ljava/lang/String;"); if (mid == NULL) { return -3; } jstring packageName = (jstring)(*env)->CallObjectMethod(env, obj, mid); // packageManager->getPackageInfo(packageName, GET_SIGNATURES); cls = (*env)->GetObjectClass(env, pm); mid = (*env)->GetMethodID(env, cls, "getPackageInfo", "(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;"); jobject packageInfo = (*env)->CallObjectMethod(env, pm, mid, packageName, 0x40); //GET_SIGNATURES = 64; cls = (*env)->GetObjectClass(env, packageInfo); jfieldID fid = (*env)->GetFieldID(env, cls, "signatures", "[Landroid/content/pm/Signature;"); jobjectArray signatures = (jobjectArray)(*env)->GetObjectField(env, packageInfo, fid); jobject sig = (*env)->GetObjectArrayElement(env, signatures, 0); cls = (*env)->GetObjectClass(env, sig); mid = (*env)->GetMethodID(env, cls, "hashCode", "()I"); int sig_value = (int)(*env)->CallIntMethod(env, sig, mid); return sig_value;}
0 0
- Android NDK几点回调方式
- Android NDK几点回调方式
- Android NDK几点回调方式(device id & signature)
- Android 非NDK方式编译C文件
- android NDK 环境配置两种方式
- android ndk 的另一种注册方式
- android NDK方式调用Jar包
- Android Studio 2.2 NDK CMake方式入门
- Android Studio 2.2 NDK CMake方式入门
- 【转载】Android Studio 2.2 NDK cMake 方式
- 最新的android studio NDK食用方式
- android ndk 编译方式,静态库、动态库、可执行文件
- android ndk 编译方式,静态库、动态库、可执行文件
- Android JNI和NDK学习(03)--动态方式实现JNI
- Android NDK *** could not be resolved 解决方式
- Android NDK开发(七)——现代化开发方式
- Android Studio 2.3使用CMake方式NDK入门
- Android Studio 2.2 NDK 开发 之 cMake 方式
- URAL 1787. Turn for MEGA
- [湖大热身赛]Tractor(数学?)
- 日志文件设置归档目标
- 浅析数组与指针的联系与区别2
- 【记录】MyEclipse下web.xml报错Invalid content was found starting with element 'display-name'
- Android NDK几点回调方式
- 【bzoj1927】【SDOI2010】【星际竞速】【bzoj1877】【SDOI2009】【晨跑】
- 欢迎使用CSDN-markdown编辑器
- 垃圾收集与内存分配 - 《深入理解Java虚拟机》ch03笔记
- 深入JVM系列(一)之内存模型与内存分配
- TCP-IP协议详解(1)邮差与邮局 (网络协议概观)
- Quartz.NET学习系列(二)--- 简单触发器
- C#_label值清空
- [boost][filesystem] 扫描给定目录下所有项