相应的java方法:

void getsign(Context context) throws Exception {
PackageInfo localPackageInfo = context.getPackageManager()
.getPackageInfo(context.getPackageName(), 64);
StringBuilder localStringBuilder = new StringBuilder();
Signature[] arrayOfSignature = localPackageInfo.signatures;
Signature localSignature = arrayOfSignature[0]; MessageDigest localMessageDigest = MessageDigest.getInstance("MD5");
localMessageDigest.update(localSignature.toByteArray());
// 这个就是签名的md5值
String str2 = toHex(localMessageDigest.digest());
} private String toHex(byte[] paramArrayOfByte) {
StringBuffer localStringBuffer = new StringBuffer();
for (int i = 0; i < paramArrayOfByte.length; i++) {
Object[] arrayOfObject = new Object[1];
arrayOfObject[0] = Byte.valueOf(paramArrayOfByte[i]);
localStringBuffer.append(String.format("%02x", arrayOfObject));
}
return localStringBuffer.toString();
}

jni中能够调用java的方法,參照上面的java方法能够相应写出jni的c代码:

// 字节流转换为十六进制字符串
//http://blog.csdn.net/pingd/article/details/41945417
void ByteToHexStr(const unsigned char* source, char* dest, int sourceLen)
{
short i;
unsigned char highByte, lowByte; for (i = 0; i < sourceLen; i++)
{
highByte = source[i] >> 4;
lowByte = source[i] & 0x0f; highByte += 0x30; if (highByte > 0x39)
dest[i * 2] = highByte + 0x07;
else
dest[i * 2] = highByte; lowByte += 0x30;
if (lowByte > 0x39)
dest[i * 2 + 1] = lowByte + 0x07;
else
dest[i * 2 + 1] = lowByte;
}
return;
} JNIEXPORT jstring JNICALL Java_com_hengbao_util_DecodeUtil_test(JNIEnv * env, jobject thiz, jobject context) {
//java code=======================================================
// PackageInfo localPackageInfo = context.getPackageManager()
// .getPackageInfo(context.getPackageName(), 64);
// StringBuilder localStringBuilder = new StringBuilder();
// Signature[] arrayOfSignature = localPackageInfo.signatures;
// Signature localSignature = arrayOfSignature[0];
// MessageDigest localMessageDigest = MessageDigest.getInstance("MD5");
// localMessageDigest.update(localSignature.toByteArray());
// // 这个就是签名的md5值
// String str2 = toHex(localMessageDigest.digest());
// localStringBuilder.append("Signature of ")
// .append(localPackageInfo.packageName).append('\n').append(str2);
// System.out.println(localStringBuilder.toString());
// TextView tv = (TextView) findViewById(R.id.tv);
// tv.setText(localStringBuilder.toString()); // private String toHex(byte[] paramArrayOfByte) {
// StringBuffer localStringBuffer = new StringBuffer();
// for (int i = 0; i < paramArrayOfByte.length; i++) {
// Object[] arrayOfObject = new Object[1];
// arrayOfObject[0] = Byte.valueOf(paramArrayOfByte[i]);
// localStringBuffer.append(String.format("%02x", arrayOfObject));
// }
// return localStringBuffer.toString();
// }
//java code====================================================== jclass tem_class;
jmethodID tem_method;
jclass class_context = (*env)->GetObjectClass(env, context);
// PackageInfo localPackageInfo = context.getPackageManager()
// .getPackageInfo(context.getPackageName(), 64);
tem_method = (*env)->GetMethodID(env, class_context, "getPackageManager", "()Landroid/content/pm/PackageManager;");
jobject obj_package_manager = (*env)->CallObjectMethod(env, context, tem_method);
// getPackageName
tem_method = (*env)->GetMethodID(env, class_context, "getPackageName", "()Ljava/lang/String;");
jobject obj_package_name = (*env)->CallObjectMethod(env, context, tem_method);
// getPackageInfo
tem_class = (*env)->GetObjectClass(env, obj_package_manager);
tem_method = (*env)->GetMethodID(env, tem_class, "getPackageInfo", "(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;");
jobject obj_package_info = (*env)->CallObjectMethod(env, obj_package_manager, tem_method, obj_package_name, 64); // Signature[] arrayOfSignature = localPackageInfo.signatures;
// Signature localSignature = arrayOfSignature[0];
tem_class = (*env)->GetObjectClass(env, obj_package_info);
jfieldID fieldID_signatures = (*env)->GetFieldID(env, tem_class, "signatures", "[Landroid/content/pm/Signature;");
jobjectArray signatures = (*env)->GetObjectField(env, obj_package_info, fieldID_signatures);
jobject signature = (*env)->GetObjectArrayElement(env, signatures, 0);
// localSignature.toByteArray()
tem_class = (*env)->GetObjectClass(env, signature);
tem_method = (*env)->GetMethodID(env, tem_class, "toByteArray", "()[B");
jobject obj_sign_byte_array = (*env)->CallObjectMethod(env, signature, tem_method);// 这个就是拿到的签名byte数组 // MessageDigest localMessageDigest = MessageDigest.getInstance("MD5");
jclass class_MessageDigest = (*env)->FindClass(env, "java/security/MessageDigest");
tem_method = (*env)->GetStaticMethodID(env, class_MessageDigest, "getInstance", "(Ljava/lang/String;)Ljava/security/MessageDigest;");
jobject obj_md5 = (*env)->CallStaticObjectMethod(env, class_MessageDigest, tem_method, (*env)->NewStringUTF(env, "md5"));
// localMessageDigest.update(localSignature.toByteArray());
//tem_class = (*env)->GetObjectClass(env, obj_md5);
tem_method = (*env)->GetMethodID(env, class_MessageDigest, "update", "([B)V");// 这个函数的返回值是void,写V
(*env)->CallVoidMethod(env, obj_md5, tem_method, obj_sign_byte_array);
// localMessageDigest.digest()
tem_method = (*env)->GetMethodID(env, class_MessageDigest, "digest", "()[B");
// 这个是md5以后的byte数组,如今仅仅要将它转换成16进制字符串。就能够和之前的比較了
jobject obj_array_sign = (*env)->CallObjectMethod(env, obj_md5, tem_method);// jni中有强转类型的概念吗
// // 这个就是签名的md5值
// String str2 = toHex(localMessageDigest.digest()); // 尝试用c写一下:http://blog.csdn.net/pingd/article/details/41945417
jsize int_array_length = (*env)->GetArrayLength(env, obj_array_sign);
jbyte* byte_array_elements = (*env)->GetByteArrayElements(env, obj_array_sign, JNI_FALSE);
char* char_result = (char*) malloc(int_array_length*2+1);// 開始没有+1。在有的情况下会越界产生问题,还是在后面补上\0比較好
// 将byte数组转换成16进制字符串,发现这里不用强转。jbyte和unsigned char应该字节数是一样的
ByteToHexStr(byte_array_elements, char_result, int_array_length);
*(char_result+int_array_length*2) = '\0';// 在末尾补\0
jstring string_result = (*env)->NewStringUTF(env, char_result);
// release
(*env)->ReleaseByteArrayElements(env, obj_array_sign, byte_array_elements, JNI_ABORT);
// 释放指针使用free
free(char_result);
return string_result; // 假设使用java的16进制转换的话,应该也能够的。用c写16进制转换太麻烦
//jclass class_HandleData = (*env)->FindClass(env, "com/hengbao/util/HandleData");
//tem_method = (*env)->GetStaticMethodID(env, class_HandleData, "bytesToHexString1", "([B)Ljava/lang/String;");
//jobject obj_result = (*env)->CallStaticObjectMethod(env, class_HandleData, tem_method, obj_array_sign);
//return obj_result;
}

jni中调用java方法获取当前apk的签名文件md5值的更多相关文章

  1. cocos2d-x中使用JNI的调用JAVA方法

    用cocos2d-x公布Android项目时.都应该知道要用JAVA与C/C++进行交互时会涉及到JNI的操作(Java Native Interface).JNI是JAVA的一个通用接口.旨在本地化 ...

  2. JS与OC交互,JS中调用OC方法(获取JSContext的方式)

    最近用到JS和OC原生方法调用的问题,查了许多资料都语焉不详,自己记录一下吧,如果有误欢迎联系我指出. JS中调用OC方法有三种方式: 1.通过获取JSContext的方式直接调用OC方法 2.通过继 ...

  3. cocos2d 中使用jni C++ 调用 Java 方法

    1.简单数据类型样例 如果我们Java中有这么一个open的静态方法,它没有參数,有一个int的返回值.怎么在C++中调用它呢? package cb.CbCCBLE; public class Cb ...

  4. 在c/c++中调用Java方法

    JNI就是Java Native Interface, 即可以实现Java调用本地库, 也可以实现C/C++调用Java代码, 从而实现了两种语言的互通, 可以让我们更加灵活的使用. 通过使用JNI可 ...

  5. Android JNI之调用JAVA方法的返回类型签名

    从http://blog.csdn.net/lonelyroamer/article/details/7932787截取的 如何签名: 下面看看Sign签名如何写,来表示要取得的属性或方法的类型. 1 ...

  6. HAL中通过JNI调用java方法【转】

    转载请注明本文出处:http://www.cnblogs.com/xl19862005 作者:Xandy 由于工作的需要,最近一直在研究HAL.JNI.Java方法之间互调的问题,并做了如下一些记录和 ...

  7. Android Studio NDK开发-JNI调用Java方法

    相对于NDK来说SDK里面有更多API可以调用,有时候我们在做NDK开发的时候,需要在JNI直接Java中的方法和变量,比如callback,系统信息等.... 如何在JNI中调用Java方法呢?就需 ...

  8. java native interface JNI 调用Java方法

    在上一篇文章中介绍了JNI.以及java调用JNI.这篇讲一下 JNI调用java方法. 通过使用合适的JNI函数,你能够创建Java对象,get.set 静态(static)和 实例(instanc ...

  9. Unity调用Android Studio中的Java方法

    1. 新建Unity项目: 2. Android Studio中新建EmptyActivity: 3. 新建安卓项目时记住最小版本号: 4. 将左侧项目文件浏览面板切换到Project项下,在本项根节 ...

随机推荐

  1. iOS开发之block解析

    1. block的本质是一个Objective-C的对象,为什么这么说? 在Objective-C中,runtime会在执行时依据对象的isa指针的指向,来度额定这个对象的类型,也能够觉得一个对象,它 ...

  2. Fast Flux技术——本质就是跳板,控制多个机器,同一域名指向极多的IP(TTL修改为0),以逃避追踪

    转自:http://ytuwlg.iteye.com/blog/355718 通过病毒邮件和欺诈网站学到的对付网络封锁的好东西:Fast Flux技术 收到一封邮件,引起我的好奇了: 邮件标题是:Ha ...

  3. 实时监控Cat之旅~对请求是否正常结束做监控(分布式的消息树)

    对基于请求的分布式消息树的分析 在MVC时有过滤器System.Web.Mvc.ActionFilterAttribute,它可以对action执行的整个过程进行拦截,执行前与执行后我们可以注入自己的 ...

  4. 如何设置eclipse代码自动提示功能

    如何设置eclipse代码自动提示功能 我们在刚安装完使用eclipse进行开发时,会发现没有代码提示会非常的不方便,下面小编将告诉你如何进行代码自动提示的设置. 工具/原料   eclipse 电脑 ...

  5. Asp.Net中使用水晶报表(中)

    Asp.Net中使用水晶报表(中) 使用Pull模式 我们将通过下面的这些步骤来通过Pull模式来执行水晶报表 1.首先创建rpt文件,并使用水晶报表设计接口设置一些必须的数据连接. 2.拖放一个 C ...

  6. 一些标签库的学习和do的讨论

    JSTL 核心标签库http://www.cnblogs.com/lihuiyy/archive/2012/02/24/2366806.html .do的讨论http://bbs.csdn.net/t ...

  7. nginx 配置若干问题

    配置nginx,遇到的几个小问题: 1. 报错信息: # nginx -t nginx: [warn] conflicting server name , ignored 分析解决: 配置文件中,重复 ...

  8. 【转】NPOI使用手册

    [转]NPOI使用手册 NPOI使用手册 目录 1.认识NPOI 2. 使用NPOI生成xls文件 2.1 创建基本内容 2.1.1创建Workbook和Sheet 2.1.2创建DocumentSu ...

  9. 洛谷 P1542 包裹快递

    P1542 包裹快递 题目描述 小K成功地破解了密文.但是乘车到X国的时候,发现钱包被偷了,于是无奈之下只好作快递员来攒足路费去Orz教主…… 一个快递公司要将n个包裹分别送到n个地方,并分配给邮递员 ...

  10. 为什么Java里的Arrays.asList不能用add和remove方法?

    在平时的开发过程中,我们知道能够将一个Array的对象转化为List.这种操作,我们仅仅要採用Arrays.asList这种方法即可了.笔者前段时间一直用这种方法,有一天,我发现通过Arrays.as ...