一、NDK中获取android设备ID的方式

Java代码如下(获取设备ANDROID_ID):

  1. final String androidId = Secure.getString(context.getContentResolver(), Secure.ANDROID_ID);

对应的c代码(相当蛋疼),注意如果是C++,需要把所有的(*env)->替换成env->,同时去掉第一个参数env

  1. char *
  2. get_android_id(JNIEnv *env, jobject mContext, jobject actObj)
  3. {
  4. char *szDevId = NULL;
  5.  
  6. if (!mContext) {
  7. return szDevId;
  8. }
  9.  
  10. jclass resCls = (*env)->FindClass(env, "android/content/Context");
  11. jmethodID getMethod = (*env)->GetMethodID(env, resCls, "getContentResolver", "()Landroid/content/ContentResolver;");
  12. jobject resolver = (*env)->CallObjectMethod(env, actObj, getMethod);
  13. if (resolver == NULL) {
  14. LOGE("Invalid resolver!");
  15. }
  16.  
  17. jclass cls_context = (*env)->FindClass(env, "android/provider/Settings$Secure");
  18. if (cls_context == NULL) {
  19. LOGE("Invalid cls_context!");
  20. }
  21.  
  22. jmethodID getStringMethod = (*env)->GetStaticMethodID(env, cls_context, "getString", "(Landroid/content/ContentResolver;Ljava/lang/String;)Ljava/lang/String;");
  23. if (getStringMethod == NULL) {
  24. LOGE("Invalid getStringMethod!");
  25. }
  26.  
  27. jfieldID ANDROID_ID = (*env)->GetStaticFieldID(env, cls_context,
  28. "ANDROID_ID", "Ljava/lang/String;");
  29. jstring str = (jstring)((*env)->GetStaticObjectField(env, cls_context, ANDROID_ID));
  30.  
  31. jstring jId = (jstring)((*env)->CallStaticObjectMethod(env, cls_context, getStringMethod, resolver, str));
  32. szDevId = (char *)((*env)->GetStringUTFChars(env, jId, 0));
  33.  
  34. return szDevId;
  35. }

如果是手机,还可以通过TelephoneManager.getDeviceId()方式来获取:

Java代码:

  1. final String deviceId = ((TelephonyManager) context.getSystemService( Context.TELEPHONY_SERVICE )).getDeviceId();

对应的C代码:

  1. char *
  2. get_telepone_id(JNIEnv *env, jobject mContext, jobject actObj) {
  3. char *szDevId = NULL;
  4.  
  5. if(mContext == 0){
  6. return szDevId;
  7. }
  8.  
  9. jclass cls_context = (*env)->FindClass(env, "android/content/Context");
  10.  
  11. jmethodID getSystemService = (*env)->GetMethodID(env, cls_context, "getSystemService",
  12. "(Ljava/lang/String;)Ljava/lang/Object;");
  13.  
  14. if(!getSystemService){
  15. return szDevId;
  16. }
  17.  
  18. jfieldID TELEPHONY_SERVICE = (*env)->GetStaticFieldID(env, cls_context,
  19. "TELEPHONY_SERVICE", "Ljava/lang/String;");
  20. if(!TELEPHONY_SERVICE){
  21. return szDevId;
  22. }
  23.  
  24. jstring str = (jstring)(*env)->GetStaticObjectField(env, cls_context, TELEPHONY_SERVICE);
  25. jclass cls_tm = (*env)->FindClass(env, "android/telephony/TelephonyManager");
  26. if(!cls_tm){
  27. return szDevId;
  28. }
  29.  
  30. jobject telephonymanager = (*env)->CallObjectMethod(env, actObj, getSystemService, str);
  31. if(!telephonymanager){
  32. return szDevId;
  33. }
  34.  
  35. jmethodID getDeviceId = (*env)->GetMethodID(env, cls_tm, "getDeviceId", "()Ljava/lang/String;");
  36. if(!getDeviceId){
  37. return szDevId;
  38. }
  39. jstring deviceid = (jstring)(*env)->CallObjectMethod(env, telephonymanager, getDeviceId);
  40.  
  41. szDevId = (char *)(*env)->GetStringUTFChars(env, deviceid, 0);
  42.  
  43. (*env)->DeleteLocalRef(env, cls_tm);
  44. (*env)->DeleteLocalRef(env, cls_context);
  45. (*env)->DeleteLocalRef(env, telephonymanager);
  46.  
  47. return szDevId;
  48. }

二、通过NDK获取证书签名

Java代码:

  1. PackageInfo pis;
  2. try {
  3. pis = mContext.getPackageManager().getPackageInfo(packageName, PackageManager.GET_SIGNATURES); //获取包信息
  4. Signature sigs = pis.signatures[0]; //获取签名
  5. int hash = sigs.hashCode(); //获取签名的哈希码
  6. } catch(Exception e) {
  7. //TODO:log here.
  8. }

对应的C代码:

  1. int
  2. get_apk_signature(JNIEnv *env, jobject obj) {
  3.  
  4. jclass cls = (*env)->FindClass(env, "android/content/ContextWrapper");
  5. //this.getPackageManager();
  6. jmethodID mid = (*env)->GetMethodID(env, cls, "getPackageManager",
  7. "()Landroid/content/pm/PackageManager;");
  8. if (mid == NULL) {
  9. return -1;
  10. }
  11.  
  12. jobject pm = (*env)->CallObjectMethod(env, obj, mid);
  13. if (pm == NULL) {
  14. return -2;
  15. }
  16.  
  17. //this.getPackageName();
  18. mid = (*env)->GetMethodID(env, cls, "getPackageName", "()Ljava/lang/String;");
  19. if (mid == NULL) {
  20. return -3;
  21. }
  22.  
  23. jstring packageName = (jstring)(*env)->CallObjectMethod(env, obj, mid);
  24.  
  25. // packageManager->getPackageInfo(packageName, GET_SIGNATURES);
  26. cls = (*env)->GetObjectClass(env, pm);
  27. mid = (*env)->GetMethodID(env, cls, "getPackageInfo", "(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;");
  28. jobject packageInfo = (*env)->CallObjectMethod(env, pm, mid, packageName, 0x40); //GET_SIGNATURES = 64;
  29. cls = (*env)->GetObjectClass(env, packageInfo);
  30. jfieldID fid = (*env)->GetFieldID(env, cls, "signatures", "[Landroid/content/pm/Signature;");
  31. jobjectArray signatures = (jobjectArray)(*env)->GetObjectField(env, packageInfo, fid);
  32. jobject sig = (*env)->GetObjectArrayElement(env, signatures, 0);
  33.  
  34. cls = (*env)->GetObjectClass(env, sig);
  35. mid = (*env)->GetMethodID(env, cls, "hashCode", "()I");
  36. int sig_value = (int)(*env)->CallIntMethod(env, sig, mid);
  37. return sig_value;
  38. }

[转]Android NDK几点回调方式的更多相关文章

  1. Android NDK几点回调方式

    一.NDK中获取android设备ID的方式 Java代码如下(获取设备ANDROID_ID): final String androidId = Secure.getString(context.g ...

  2. Android事件处理的2种方式:监听器与回调

    android组件的事件处理有2种方式: 1.基于监听器的事件处理方式:先定义组件,然后为组件设定监听器. 详见http://blog.csdn.net/jediael_lu/article/deta ...

  3. Android NDK调试出错Unknown Application ABI, Unable to detect application ABI's的解决方式

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

  4. 初识Android NDK

    本文介绍Windows环境下搭建Android NDK开发环境,并创建一个简单的使用Native代码的Android Application. 一.环境搭建 二.JNI函数绑定 三.例子 一.环境搭建 ...

  5. !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结

    http://hujiaweibujidao.github.io/blog/2013/11/18/android-ndk-and-opencv-development-3/ Android Ndk a ...

  6. Android NDK 和 OpenCV 整合开发总结(3)

    Android NDK 和 OpenCV 整合开发总结(3) http://hujiaweibujidao.github.io/blog/2013/11/18/android-ndk-and-open ...

  7. Android NDK开发之C调用Java及原生代码断点调试(二)

    上一篇中,我们主要学习了Java调用本地方法,并列举了两大特殊实例来例证我们的论据,还没学习的伙伴必须先去阅读下,本次的学习是直接在上一篇的基础上进行了.点击:Android NDK开发之从Java与 ...

  8. 简单的调用OpenCV库的Android NDK开发 工具Android Studio

    前言 本博客写于2017/08/11, 博主非专业搞安卓开发, 只是工作的需要倒腾了下Android NDK相关的开发, 博文中有什么不正确.不严格的地方欢迎指正哈    本文后续也许还会有删改, 就 ...

  9. Android NDK之二:创建NativeActivity

    转:http://blog.csdn.net/xiruanliuwei/article/details/7560914 Android NDK为我们提供了两种方式来实现我们的native activi ...

随机推荐

  1. build tree

    有二叉树的前序遍历和后序遍历,构造二叉树 /** * Definition for binary tree * public class TreeNode { * int val; * TreeNod ...

  2. 基于page的简单页面推送技术

    我们可以先看下简单效果,打开2个页面可以看到推送效果 服务端我们只需要下面一个方法 using System; using System.Collections.Generic; using Syst ...

  3. adb的logcat使用

    预备:安装刷机精灵,实用工具->adb命令行 1. 对于多机设备,首先使用adb devices来获知设备名称: 2. 将log输出到电脑:adb –s [设备名称] shell logcat ...

  4. 对比JQuery与JavaScript

    JavaScript 是一种脚本语言,主要用在浏览器中,实现对网页的文档对象的操作和一些用户交互动作的处理.而 jQuery 则是 JavaScript 的一个代码库(或习惯性叫类库),它将一些在 J ...

  5. [转]DOS命令

    windows dos命令 - 知识天地 - 博客园http://www.cnblogs.com/mfryf/archive/2012/02/13/2348685.html

  6. Android程序的隐藏与退出

    转自Android程序的隐藏与退出 Android的程序无需刻意的去退出,当你一按下手机的back键的时候,系统会默认调用程序栈中最上层Activity的Destroy()方法来销毁当前Activit ...

  7. 升级 Java 编程规范的6个约定

    作为 Java 开发人员,我们会遵循一系列的编码风格和开发习惯.习惯使然是一方面,另一方面,我们也从不停下脚步质疑这些习惯.一段时间以后,笔者养成了一些不同于常人的编码风格和开发习惯.当第一次了解到这 ...

  8. Python写UTF8文件,UE、记事本打开依然乱码的问题

    Python写UTF8文件,UE.记事本打开依然乱码的问题 Leave a reply 现象:使用codecs打开文件,写入UTF-8文本,正常无错误.用vim打开正常,但记事本.UE等打开乱码. 原 ...

  9. 监控Activity在前后台状态的切换

    public class BaseActivity extends Activity{ @Overrideprotected void onStop() { boolean isOnForegroun ...

  10. Node.js权威指南 (5) - 使用Buffer类处理二进制数据

    5.1 创建Buffer对象 / 705.2 字符串的长度与缓存区的长度 / 725.3 Buffer对象与字符串对象之间的相互转换 / 74 5.3.1 Buffer对象的toString方法 / ...