另一个用户如何不使用C ++库?

时间:2018-08-17 05:05:07

标签: android c++

我创建了一个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)下是唯一的,您可以为应用程序使用签名认证方法。

4 个答案:

答案 0 :(得分:2)

在C ++库中创建一个函数以初始化使用调用者应用程序上下文的库。从该上下文中获取包名称。如果该程序包名称与您的应用程序不匹配,则抛出异常并且不初始化。

答案 1 :(得分:1)

您可以构建该库,以便它公开一个接受GUID的接口,以便允许访问其余功能。如果GUID不匹配,则将这些API存根,或者可以使它们引发异常。查找从库公开C ++接口。我记得在这种情况下可以使用抽象接口。

答案 2 :(得分:1)

您可以将其编译为静态库,然后将其编译为应用程序吗?我记得当我们遇到DLL-hell时采用了这种方法。

答案 3 :(得分:1)

请注意,您的图书馆无法获得100%的保护,但您访问“受保护的信息”的难度会越来越大:

  • GUID或许可证密钥
  • 检查程序包名称
  • 使用在线密钥服务器