相应的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. 大海教你学手游2015CocosLua第一季_00课程介绍

    话说大盘从5100直掉到3500点,千仅仅股票跌幅超过20%,跌跌不休.散户.证监会.做空机构開始斗气地主来了: 散户:叫地主 空头:抢地主,3分 证监会:pass 空头:压死 证监会:不要 散户:不 ...

  2. ubuntu16.04下snort的安装(官方文档安装)(图文详解)

    不多说,直接上干货! 最近为了科研,需要安装和使用Snort. snort的官网 https://www.snort.org/ Snort作为一款优秀的开源主机入侵检测系统,在windows和Linu ...

  3. IE11 mobile 的 UA(User-Agent)

    如果您在 IE11 mobile 上获得的 UA(User-Agent) 是 Mozilla/5.0 (Mobile; Linux; Android 4.2; Microsoft Build/Virt ...

  4. AIX系统谨慎使用reboot命令

    在客户一次停机维护中,发现了这个问题. 环境是ORACLE 10G RAC for AIX6,使用了HACMP管理共享磁盘. 在停机维护时间段内需要重启主机,当关闭了数据库和CLUSTER后,节点1使 ...

  5. df 显示 100%的问题

    问题:         使用 df 命令查看,某个分区使用率已经达到100%,但是用du 命令统计该分区,发现该分区空间剩余10G可用.         实例:                分析: ...

  6. git新克隆代码的时候ssh协议

  7. 常用模块re模块(正则表达式)

    re模块 一:什么是正则? 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则.(在Python中)它内嵌在Python中, ...

  8. Python对象的循环引用问题

    目录 Python对象循环引用 循环引用垃圾回收算法 容器对象 生成容器对象 追踪容器对象 结束追踪容器对象 分代容器对象链表 何时执行循环引用垃圾回收 循环引用的垃圾回收 循环引用中的终结器 pyt ...

  9. while循环合理运用-判断成绩脚本

    在平时的工作生活中,难免不了去写一些交互性质的脚本,然而呢往往有些用户偏偏会输入不合规范的输入,为了避免就此退出脚本重新执行,这时候就可以用while去写一个死循环去针对用户的输出啊.哈哈~他输不对, ...

  10. ssh 免交互式登陆

    脚本: vim key.sh #!/bin/bash#make key\rm -f /root/.ssh/id_dsassh-keygen -t dsa -f /root/.ssh/id_dsa -P ...