首页 > 解决方案 > 如何使用 JNI 从 Android 本机 C++ 调用 PackageManager.hasSystemFeature?

问题描述

如何在 Android 中从 C++ 访问 PackageManager 和相关方法(如 hasSystemFeature)?

标签: androidc++candroid-ndkjava-native-interface

解决方案


我最近需要这样做,并拼凑了许多其他答案以使其正常工作。在这里分享它以防它帮助别人。

要使用,请传入您要检查的应用程序上下文和功能字符串。这应该很容易扩展到其他 PackageManager 方法。

extern "C" JNIEXPORT jboolean JNICALL Java_com_your_cool_application_MainActivity_native_1hasSystemFeature(
        JNIEnv *env, jobject calling_object, jobject main_activity, jstring feature_string) {
    jclass activity_class = env->GetObjectClass(main_activity);

    //context.getPackageManager()
    jmethodID method_id_pm = env->GetMethodID(activity_class, "getPackageManager", "()Landroid/content/pm/PackageManager;");
    jobject package_manager  = env->CallObjectMethod(main_activity, method_id_pm);
    jclass pm_class = env->GetObjectClass(package_manager);

    //PackageManager.hasSystemFeature()
    jmethodID method_id_feature = env->GetMethodID(pm_class,"hasSystemFeature", "(Ljava/lang/String;)Z");
    jboolean has_feature = env->CallBooleanMethod(package_manager, method_id_feature, feature_string);

    return has_feature;
}

推荐阅读