Android 如何制作返回sha1应用程序密钥的本机库
我需要本机的库,它计算sha1键并将其返回给应用程序 我还尝试: 但我不能编译成这样 也许有人有使用本机的经验,可以帮助我。Android 如何制作返回sha1应用程序密钥的本机库,android,java-native-interface,native,Android,Java Native Interface,Native,我需要本机的库,它计算sha1键并将其返回给应用程序 我还尝试: 但我不能编译成这样 也许有人有使用本机的经验,可以帮助我。jstring find(JNIEnv*env、jobject thiz、jobject contexObject) jstring find(JNIEnv *env, jobject thiz, jobject contexObject) { jclass contextTemp = env->FindClass("android/content/Cont
jstring find(JNIEnv*env、jobject thiz、jobject contexObject)
jstring find(JNIEnv *env, jobject thiz, jobject contexObject)
{
jclass contextTemp = env->FindClass("android/content/Context");
jclass contextClass = (jclass)env->NewGlobalRef(contextTemp);
jmethodID getPackageManager = env->GetMethodID(contextClass,
"getPackageManager",
"()Landroid/content/pm/PackageManager;");
jobject share = (jobject)env->CallObjectMethod(contexObject, getPackageManager);
jmethodID getPackageName = env->GetMethodID(contextClass, "getPackageName",
"()Ljava/lang/String;");
jstring packageName = (jstring)env->CallObjectMethod(contexObject, getPackageName);
jclass clazz = env->FindClass("android/content/pm/PackageManager");
jfieldID GET_SIGNATURESfid = env->GetStaticFieldID( clazz, "GET_SIGNATURES", "I");
jint GET_SIGNATURES = env->GetStaticIntField(clazz,GET_SIGNATURESfid);
//jclass temp = env->FindClass("android/content/pm/PackageManager");
jclass PackageManagerObj = (jclass)env->NewGlobalRef(clazz);
jmethodID getPackageInfoId = env->GetMethodID(PackageManagerObj, "getPackageInfo",
"(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;");
jobject getPackageInfoObject = (jobject)env->CallObjectMethod(share, getPackageInfoId,
packageName,GET_SIGNATURES);
jclass packageInfoClass = env->FindClass("android/content/pm/PackageInfo");
jfieldID signatures = env->GetFieldID(packageInfoClass,"signatures","[Landroid/content/pm/Signature;");
jobjectArray rows = reinterpret_cast<jobjectArray>(
env->GetObjectField(getPackageInfoObject,signatures));
int size = env->GetArrayLength(rows);
jclass signaturesClass = env->FindClass("android/content/pm/Signature");
jclass mEssage = env->FindClass("java/security/MessageDigest");
jclass MessageDigestClass = (jclass)env->NewGlobalRef(mEssage);
jmethodID mGetInstance = env->GetStaticMethodID(MessageDigestClass,"getInstance","(Ljava/lang/String;)Ljava/security/MessageDigest;");
jmethodID updateMethod = env->GetMethodID(MessageDigestClass,"update","([B)V");
jmethodID toByteArrayMethod = env->GetMethodID(signaturesClass,"toByteArray","()[B");
jclass tempBase64 = env->FindClass("android/util/Base64");
jclass Base64Class = (jclass)env->NewGlobalRef(tempBase64);
jmethodID encodeToStringID = env->GetStaticMethodID(Base64Class,"encodeToString","([BI)Ljava/lang/String;");
jmethodID digest = env->GetMethodID(MessageDigestClass,"digest","()[B");
for(int i = 0 ;i<size;i++){
jobject messageDigest = env->CallStaticObjectMethod(MessageDigestClass,mGetInstance,env->NewStringUTF("SHA"));
jobject signature = env->GetObjectArrayElement(rows,i);
env->CallVoidMethod(messageDigest,updateMethod,(jbyteArray)env->CallObjectMethod(signature,toByteArrayMethod));
return (jstring)env->CallStaticObjectMethod(Base64Class,encodeToStringID,env->CallObjectMethod(messageDigest,digest),(jint)0);
}
return env->NewStringUTF("");
{
jclass contextTemp=env->FindClass(“android/content/Context”);
jclass contextClass=(jclass)env->NewGlobalRef(contextTemp);
jmethodID getPackageManager=env->GetMethodID(contextClass,
“getPackageManager”,
“()Landroid/content/pm/PackageManager;”;
jobject share=(jobject)env->CallObjectMethod(contexObject,getPackageManager);
jmethodID getPackageName=env->GetMethodID(contextClass,“getPackageName”,
“()Ljava/lang/String;”;
jstring packageName=(jstring)env->CallObjectMethod(contexObject,getPackageName);
jclass clazz=env->FindClass(“android/content/pm/PackageManager”);
jfieldID GET_signatureFID=env->GetStaticFieldID(clazz,“GET_SIGNATURES”,“I”);
jint GET_SIGNATURES=env->GetStaticIntField(clazz,GET_SIGNATURESfid);
//jclass temp=env->FindClass(“android/content/pm/PackageManager”);
jclass PackageManagerObj=(jclass)env->NewGlobalRef(clazz);
jmethodID getPackageInfo=env->GetMethodID(PackageManagerObj,“getPackageInfo”,
“(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;”;
jobject GetPackageInfo对象=(jobject)env->CallObjectMethod(共享,GetPackageInfo,
packageName,获取_签名);
jclass-PackageInfo class=env->FindClass(“android/content/pm/PackageInfo”);
jfieldID signatures=env->GetFieldID(PackageInfo类,“signatures”,“[Landroid/content/pm/Signature;”;
jobjectArray行=重新解释(
env->GetObjectField(getPackageInfo对象,签名));
int size=env->GetArrayLength(行);
jclass SignatureClass=env->FindClass(“android/content/pm/Signature”);
jclass mEssage=env->FindClass(“java/security/MessageDigest”);
jclass MessageDigestClass=(jclass)env->NewGlobalRef(消息);
jmethodID mGetInstance=env->GetStaticMethodID(MessageDigestClass,“getInstance”,“Ljava/lang/String;)Ljava/security/MessageDigest;”;
jmethodID updateMethod=env->GetMethodID(MessageDigestClass,“update”,“([B)V”);
jmethodID toByteArrayMethod=env->GetMethodID(SignatureClass,“toByteArray”,“()[B”);
jclass tempBase64=env->FindClass(“android/util/Base64”);
jclass Base64Class=(jclass)env->NewGlobalRef(tempBase64);
jmethodide encodeToStringID=env->GetStaticMethodID(Base64Class,“encodeToString”,“([BI)Ljava/lang/String;”;
jmethodide digest=env->GetMethodID(messagedigest类,“digest”,“()[B”);
对于(int i=0;iCallStaticObjectMethod(MessageDigestClass、mGetInstance、env->NewStringUTF(“SHA”);
jobject signature=env->GetObjectArrayElement(行,i);
env->CallVoidMethod(messageDigest,updateMethod,(jbyteArray)env->CallObjectMethod(signature,toByteArrayMethod));
return(jstring)env->CallStaticObjectMethod(Base64Class,encodeToStringID,env->CallObjectMethod(messageDigest,digest),(jint)0);
}
返回env->NewStringUTF(“”);
非常疯狂,如果你喜欢…它的可能副本并不复杂。我需要本机代码中的sha1,而不是java。请详细说明如何使用你的函数及其实际功能。这将帮助读者理解你答案的内容。