一、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代码:

int
get_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; }

转载于:https://www.cnblogs.com/qiangxia/p/5217859.html

[转]Android NDK几点回调方式相关推荐

  1. Android NDK调试出错Unknown Application ABI, Unable to detect application ABI#39;s的解决方式...

    今天在调试Android NDK的时候,ADT的控制台报了这个错误: Unknown Application ABI, Unable to detect application ABI's 在网上查了 ...

  2. Android NDK开发Crash错误定位[转]

    使用 ndk-stack 的时候需要你的 lib 编译为 debug版的,通常需要下面的修改: 1. 修改 android.mk,增加,为 LOCAL_CFLAGS 增加 -g 选项 2. 修改 ap ...

  3. Android NDK开发Crash错误定位

    在Android开发中,程序Crash分三种情况:未捕获的异常.ANR(Application Not Responding)和闪退(NDK引发错误).其中未捕获的异常根据logcat打印的堆栈信息很 ...

  4. android.mk 添加v7_在Android上以命令行方式移植FFmpeg

    最近要做视频I帧提取和摘要生成的项目,在Android平台上的应用,经过调研,发现ffmpeg有很多相关功能的轮子,因此考虑将ffmpeg移植到Android平台.为了更好解耦和以及更多的文档参考,选 ...

  5. Android NDK开发之旅29 云服务器Ubuntu下搭建NDK环境,并编译FFmpeg

    ###前言 因为在Linux环境下编译FFmpeg生成库和头文件下比较方便,所以接下来主要操作在Linux环境下进行.但是对于Android NDK 开发新手来说,自己电脑配置Ubuntu Linux ...

  6. Android NDK基础样例

    Android NDK基础样例 NDK(Native Development Kit),用C/C++封装一些东西?好像就这么理解好了== 一.环境准备 这个好讨厌==!因为我环境都已经搭了很久了. 已 ...

  7. windows系统上安装与使用Android NDK

    转自http://www.cnblogs.com/luxiaofeng54/archive/2011/02/12/1952391.html 很早就听说了android的NDK应用,只是一直没有时间去研 ...

  8. Android NDK开发之旅(2):一篇文章搞定Android Studio中使用CMake进行NDK/JNI开发

    Android NDK开发之旅(2):一篇文章搞定android Studio中使用CMake进行NDK/JNI开发 (码字不易,转载请声明出处:http://blog.csdn.NET/andrex ...

  9. Android NDK开发篇(一):新版NDK环境搭建(免Cygwin,超级快)

    以前做Android的项目要用到NDK就必须要 下载NDK,下载安装Cygwin(模拟Linux环境用的),下载CDT(Eclipse C/C++开发插件),还要配置编译器,环境变量... 麻烦到不想 ...

最新文章

  1. hdu1025 Constructing Roads In JGShining#39;s Kingdom(二分+dp)
  2. 数据结构第二章线性表学习笔记
  3. linux kernel进程切换(寄存器保存与恢复)
  4. 把十进制转化为二进制的一种方法
  5. django-celery
  6. Collection 和 Map接口及其实现类总结
  7. 如何修复在Microsoft Azure中“虚拟机防火墙打开,关闭RDP的连接端口”问题
  8. 随便选一张扑克牌_教大家怎么快速记忆扑克牌?一学就会
  9. 下拉菜单,防鼠标反复触发
  10. 编写一个Applet,画出20条水平的、随机颜色的平行线。要求线的长度相同,整条线段都要在可视区域内
  11. ISAPI Rewrite 2 规则中文版
  12. 为什么深度学习有效?(why deep learning works)
  13. 【转】刨根究底字符编码之八——Unicode编码方案概述
  14. Win10分屏HDMI检测不到显示器
  15. 推荐三款实用的录音转文字软件给你
  16. uniapp App端 echarts 设置tooltip的formatter不生效问题及解决办法
  17. expdp报错ORA-39002: invalid operation,ORA-39070: Unable to open the log file
  18. JAVA中的二维数组的定义及使用
  19. login登录服务器
  20. java1.7 apk 签名_【keytool jarsigner工具的使用】Android 使用JDK1.7的工具 进行APK文件的签名,以及keystore文件的使用...

热门文章

  1. 双开虚拟机(一个是克隆的)网卡起不来...启动网卡报错..
  2. Codeup 墓地——问题 B: A+B
  3. P1800 software_NOI导刊2010提高(06)
  4. centos 升级4.0 内核
  5. centos 6.8 搭建svn服务器
  6. 怎样使用CSS3媒体查询(Media Queries)制作响应式网站
  7. CentOS yum 源的配置与使用
  8. Context-----Activity,Application之间的交流使者
  9. 交换代数笔记1|Atiyah,Chpt.1
  10. 第二阶段小组冲刺第五天总结