Search code examples
androidjava-native-interface

Detect if app installed or not, not return false


I have try to call java from jni, is not working, what am i doing wrong.

#include <jni.h>

    extern "C" {
    JNIEXPORT jboolean JNICALL Java_com_mycompany_myndkapp_HelloJni_stringFromJNI(JNIEnv* env, jobject thiz, jstring pkg)
    {

        try{

    //   context
    jclass native_context = env->GetObjectClass(thiz);

    // context.getPackageManager()
    jmethodID methodID_func = env->GetMethodID(native_context, "getPackageManager", "()Landroid/content/pm/PackageManager;");
    jobject package_manager  = env->CallObjectMethod(thiz,methodID_func);
    jclass pm_clazz = env->GetObjectClass(package_manager);

    //packageManager.getPackageInfo()
    jmethodID methodId_pm = env->GetMethodID(pm_clazz,"getPackageInfo","(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;");

    env->CallObjectMethod(package_manager,methodId_pm,pkg,0);
     } catch(...)
     {
         return 0;
     }

    return 1;
     }
    }

if app is installed return true but app is not installed force close my app.

FATAL EXCEPTION: main
06-10 11:51:19.554 3768 3768 E     AndroidRuntime                               Process: com.mycompany.myndkapp, PID: 3768
06-10 11:51:19.554 3768 3768 E     AndroidRuntime                               java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mycompany.myndkapp/com.mycompany.myndkapp.HelloJni}: android.content.pm.PackageManager$NameNotFoundException: com.demo.ndk2
06-10 11:51:19.554 3768 3768 E     AndroidRuntime                               at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2455)
06-10 11:51:19.554 3768 3768 E     AndroidRuntime                               at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2517)
06-10 11:51:19.554 3768 3768 E     AndroidRuntime                               at android.app.ActivityThread.access$800(ActivityThread.java:162)

How can i fix and return false app is not installed?


Solution

  • C++'s try/catch does not catch Java exceptions. What you need is ExceptionCheck and ExceptionClear:

    env->CallObjectMethod(package_manager, methodId_pm, pkg, 0);
    if (env->ExceptionCheck()) {
        env->ExceptionClear();
        return 0;
    }
    return 1;
    

    (Note that you should use these for every JNI call that could result in a Java exception being thrown)