博文转自http://www.tuicool.com/articles/UVjme2r,感谢博主的分享

为了防止被反编译,打算把关键代码写到so里(比如加解密),在so里加上判断APk包签名是否一致的代码,避免so被二次打包。其实用JNI读签名就是用了Java的反射机制。

先看Java读取签名的方法:

  1. try {
  2. PackageInfo info = context.getPackageManager().getPackageInfo(context.getPackageName(), 64);
  3. Signature sign = info.signatures[0];
  4. Log.i("test", "hashCode : " + sign.hashCode());
  5. } catch (NameNotFoundException e) {
  6. e.printStackTrace();
  7. }

然后我们用JNI c语言实现,同样需要传递Context:

  1. int getSignHashCode(JNIEnv *env, jobject context) {
  2. //Context的类
  3. jclass context_clazz = (*env)->GetObjectClass(env, context);
  4. // 得到 getPackageManager 方法的 ID
  5. jmethodID methodID_getPackageManager = (*env)->GetMethodID(env, context_clazz,
  6. "getPackageManager", "()Landroid/content/pm/PackageManager;");
  7.  
  8. // 获得PackageManager对象
  9. jobject packageManager = (*env)->CallObjectMethod(env, context,
  10. methodID_getPackageManager);
  11. // // 获得 PackageManager 类
  12. jclass pm_clazz = (*env)->GetObjectClass(env, packageManager);
  13. // 得到 getPackageInfo 方法的 ID
  14. jmethodID methodID_pm = (*env)->GetMethodID(env, pm_clazz, "getPackageInfo",
  15. "(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;");
  16. //
  17. // // 得到 getPackageName 方法的 ID
  18. jmethodID methodID_pack = (*env)->GetMethodID(env, context_clazz,
  19. "getPackageName", "()Ljava/lang/String;");
  20.  
  21. // 获得当前应用的包名
  22. jstring application_package = (*env)->CallObjectMethod(env, context,
  23. methodID_pack);
  24. const char *str = (*env)->GetStringUTFChars(env, application_package, 0);
  25. __android_log_print(ANDROID_LOG_DEBUG, "JNI", "packageName: %s\n", str);
  26.  
  27. // 获得PackageInfo
  28. jobject packageInfo = (*env)->CallObjectMethod(env, packageManager,
  29. methodID_pm, application_package, 64);
  30.  
  31. jclass packageinfo_clazz = (*env)->GetObjectClass(env, packageInfo);
  32. jfieldID fieldID_signatures = (*env)->GetFieldID(env, packageinfo_clazz,
  33. "signatures", "[Landroid/content/pm/Signature;");
  34. jobjectArray signature_arr = (jobjectArray)(*env)->GetObjectField(env,
  35. packageInfo, fieldID_signatures);
  36. //Signature数组中取出第一个元素
  37. jobject signature = (*env)->GetObjectArrayElement(env, signature_arr, 0);
  38. //读signature的hashcode
  39. jclass signature_clazz = (*env)->GetObjectClass(env, signature);
  40. jmethodID methodID_hashcode = (*env)->GetMethodID(env, signature_clazz,
  41. "hashCode", "()I");
  42. jint hashCode = (*env)->CallIntMethod(env, signature, methodID_hashcode);
  43. __android_log_print(ANDROID_LOG_DEBUG, "JNI", "hashcode: %d\n", hashCode);
  44. return hashCode;
  45. }

第二个参数jobject不是JNI函数的默认参数,而是传入的Context实例。

转:Android开发:使用JNI读取应用签名的更多相关文章

  1. 【转】 Android 开发 之 JNI入门 - NDK从入门到精通

    原文网址:http://blog.csdn.net/shulianghan/article/details/18964835 NDK项目源码地址 : -- 第一个JNI示例程序下载 : GitHub  ...

  2. 【Android 应用开发】Android 开发 之 JNI入门 - NDK从入门到精通

    NDK项目源码地址 : -- 第一个JNI示例程序下载 : GitHub - https://github.com/han1202012/NDKHelloworld.git -- Java传递参数给C ...

  3. Android 开发 之 JNI入门 - NDK从入门到精通

    NDK项目源码地址 : -- 第一个JNI示例程序下载 : GitHub - https://github.com/han1202012/NDKHelloworld.git -- Java传递参数给C ...

  4. Android中使用JNI获得APK签名的哈希值

    原地址:http://blog.csdn.net/i5suoi/article/details/19036975 最近在研究android应用中的安全问题,貌似只有将核心代码写到JNI底层才是最安全的 ...

  5. Android开发时包名、签名、渠道和版本号的易坑点(转)

    本文中总结一下 Android 开发中容易被忽视的一些注意事项吧: 一.谨慎选择包名 包名 (Package Name) 就相当于一款应用在户口本上登记的名字,是系统用来区分不同应用的字段.重复的包名 ...

  6. Android开发 - Retrofit 2 使用自签名的HTTPS证书进行API请求

    为了确保数据传输的安全,现在越来越多的应用使用Https的方式来进行数据传输,使用https有很多有点,比如: HTTPS协议是由SSL+HTTP协议构建的可进行加密传输.身份认证的网络协议,要比ht ...

  7. Android开发中Ant命令编译和APK签名的一些心得

    本文章麦子学院跟小伙伴们详细的分享一下关于Android Ant命令行编译和APK签名详解一些实现方法,这是一个朋友在自己做安卓开发时写的,希望对大家会有所帮助呀. 最近在做Android开发时,需要 ...

  8. 《Android开发艺术探索》读书笔记 (13) 第13章 综合技术、第14章 JNI和NDK编程、第15章 Android性能优化

    第13章 综合技术 13.1 使用CrashHandler来获取应用的Crash信息 (1)应用发生Crash在所难免,但是如何采集crash信息以供后续开发处理这类问题呢?利用Thread类的set ...

  9. 《android开发艺术探索》读书笔记(十四)--JNI和NDK编程

    接上篇<android开发艺术探索>读书笔记(十三)--综合技术 No1: Java JNI--Java Native Interface(java本地接口),它是为了方便java调用C. ...

随机推荐

  1. NAT123内网映射端口

    在无内网路由管理员权限的情况下,需要将内网web应用暴露到公网访问,此时需要用到花生壳或者nat123(两个应用都不是免费的,其中花生壳可以8元认证,以后免费使用,nat123按天收费) 花生壳 ht ...

  2. Git典型使用场景

    1. 在本地创建版本库(把本地的一个目录内的文件纳入版本库管理,方便查看变动历史,恢复版本等.不限于代码,可以是笔记等所有需要追踪历史的文件.) git init -- 把当前目录初始化为版本库 2. ...

  3. JS 4 新特性:混合属性(mixins)之二

    Mixins many classes[混合许多个类] 迄今为止,我们已经学会了简单的继承,我们还能够通过使用mixins处理机制来混合许多类.源于这种理念是非常简单的:我们能够把许多个类最终混合到一 ...

  4. zip压缩命令的使用

    file命令可以查看文件的类型 tar类型 .tar gzip类型   .gz  bzip2类型  .bz2 zip类型    .zip 如果一个压缩文件由tar命令解压的前提,2个条件 1.这个文件 ...

  5. 【zz】Matlab 二值图像形态学函数 bwmorph

    原文地址:http://blog.sina.com.cn/wind8961 函数功能: 对二值图像进行数学形态学(Mathematical Morphology)运算. 语法格式: BW2 = bwm ...

  6. OpenSSL 使用拾遗(一)---- 生成 pkcs12 文件

    从本期开始,记录一些在使用 OpenSSL 过程中碰到的问题及解决办法 在 Linux 下需要生成 pkcs12 文件,立即想到 OpenSSL.键入如下命令 ~ # openssl pkcs12 - ...

  7. (转)Web性能优化方案

    第一章 打开网站慢现状分析 在公司访问部署在IDC机房的VIP网站时会感觉很慢.是什么原因造成的?为了缩短页面的响应时间,改进我们的用户体验,我们需要知道用户的时间花在等待什么东西上. 可以跟踪一下我 ...

  8. script标签里的defer属性

    入职新公司,看代码的时候注意到有的script标签中有一个defer属性,查了一下.在这里分享出来. 需要注意的有三点,其中前两点是在错误中分辨出来的: 错误来源:http://www.w3schoo ...

  9. 普通硬件就能破解GSM A5加密算法

    如果你还在使用基于早期信号标准的GSM手机,那么你最好在使用手机的过程中小心一点了.因为根据国外媒体的最新报道,安全研究专家通过测试发现,他们只需要使用三张NVIDIA GeForce GTX690显 ...

  10. 使用spring @Scheduled注解执行定时任务、

    http://blog.csdn.net/sd4000784/article/details/7745947,留下来备用.