相应的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. 经常使用传感器协议1:CJ/T-188 水表协议解析1

          本文以实例说明CJ/T-188水表协议的解析过程,下面数据未经特殊说明,均指十六进制. 数据发送:         FE FE FE FE 68 10 44 33 22 11 00 33 ...

  2. H5学习_番外篇_PHP数据库操作

    1. 文件操作 1.1 打开关闭文件 fopen() resource fopen ( string filename, string mode [, bool use_include_path [, ...

  3. SVN管理工具的使用(实习第9天)

    最后就是我进行提交代码的时候要记得写注释,自己写了那些方法要标明,或者自己修改了哪些功能也要表明.不然我会被骂的. 2>代码冲突解决的问题: 服务器上的代码跟自己代码改动的地方不同 这种情况比较 ...

  4. less06 引入(importing)

    main.less @wp:960px; .colorsss{ color: darkgreen; } index.css .color{ color: #ff6600; } style.less / ...

  5. Android Shape使用

    说明 在Android开发中,使用shape可以很方便的帮我们画出想要的背景,相对于png图片来说,使用shape可以减少安装包的大小,而且能够更好的适配不同的手机. 使用 先贴出官网上的说明: &l ...

  6. BZOJ 1797 网络流的可行边&必须边

    求完网络流以后 tarjan一发 判一判 //By SiriusRen #include <queue> #include <bitset> #include <cstd ...

  7. 隐私:随机选择 MAC 地址

    隐私:随机选择 MAC 地址 从 Android 8.0 开始,Android 设备在未连接到网络的情况下探测新网络时会使用随机 MAC 地址. 在 Android 9 中,您可以启用开发者选项(默认 ...

  8. tf.cast(ndarray,dtype)

    转化为指定的类型,一般是将bool类型转化为其他的数据类型,例如:tf.float32

  9. vue+element-ui的简洁导入导出功能

    1.前段后台管理系统中数据展示一般都是用表格,表格会涉及到导入和导出;原生js导出excel2.导入是利用element-ui的Upload 上传组件; <el-upload class=&qu ...

  10. VS2015使用过程中参考过的有用链接

    VS中的第一个C程序:如何在Visual Studio 2015中编写C程序:https://www.bilibili.com/video/av5921799?from=search&seid ...