我创建了一个C ++库,并将其编译为文件(* .so),问题是,如果将文件(* .so)导入项目,则该文件可以被另一个应用程序使用。有没有一种方法不能被其他应用程序使用。我试图找到一个解决方案,但没事
更新 我可以使用签名方法来验证我的应用程序。
JNIEXPORT jstring JNICALL
Java_com_myapplication_MainActivity_getSignatureAPK(JNIEnv *env, jobject thiz) {
jclass cls = (env)->GetObjectClass(thiz);
jmethodID mid = (env)->GetMethodID(cls, "getPackageManager",
"()Landroid/content/pm/PackageManager;");
jobject packageManager = (env)->CallObjectMethod(thiz, mid);
mid = (env)->GetMethodID(cls, "getPackageName", "()Ljava/lang/String;");//
jstring packageName = (jstring) (env)->CallObjectMethod(thiz, mid);
cls = (env)->GetObjectClass(packageManager);
mid = (env)->GetMethodID(cls, "getPackageInfo",
"(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;");
jobject packageInfo = (env)->CallObjectMethod(packageManager, mid, packageName, 64);
cls = (env)->GetObjectClass(packageInfo);
jfieldID fid = (env)->GetFieldID(cls, "signatures", "[Landroid/content/pm/Signature;");
jobject signatur = (env)->GetObjectField(packageInfo, fid);
jobjectArray signatures = reinterpret_cast<jobjectArray>(signatur);
jobject signature = env->GetObjectArrayElement(signatures, 0);
jclass s_clazz = env->GetObjectClass(signature);
jmethodID methodId_ts = env->GetMethodID(s_clazz, "toCharsString", "()Ljava/lang/String;");
jobject ts = env->CallObjectMethod(signature, methodId_ts);
return reinterpret_cast<jstring>(ts);
}
上面的函数返回应用程序的签名,当调试签名时是相同的,但是当您生成签名的APK时,签名在密钥(* .jks)下是唯一的,您可以为应用程序使用签名认证方法。
答案 0 :(得分:2)
在C ++库中创建一个函数以初始化使用调用者应用程序上下文的库。从该上下文中获取包名称。如果该程序包名称与您的应用程序不匹配,则抛出异常并且不初始化。
答案 1 :(得分:1)
您可以构建该库,以便它公开一个接受GUID的接口,以便允许访问其余功能。如果GUID不匹配,则将这些API存根,或者可以使它们引发异常。查找从库公开C ++接口。我记得在这种情况下可以使用抽象接口。
答案 2 :(得分:1)
您可以将其编译为静态库,然后将其编译为应用程序吗?我记得当我们遇到DLL-hell时采用了这种方法。
答案 3 :(得分:1)
请注意,您的图书馆无法获得100%的保护,但您访问“受保护的信息”的难度会越来越大: