Android 如何制作返回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

我需要本机的库,它计算sha1键并将其返回给应用程序

我还尝试:

但我不能编译成这样

也许有人有使用本机的经验,可以帮助我。

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。请详细说明如何使用你的函数及其实际功能。这将帮助读者理解你答案的内容。