Определить, установлено приложение или нет, не вернуть false - PullRequest
0 голосов
/ 10 июня 2018

Я пытаюсь вызвать Java из jni, не работает, что я делаю не так.

#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;
     }
    }

если приложение установлено, верните true, но приложение не установлено, принудительно закройте мое приложение.

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)

Как я могу исправить и вернуть ложное приложение не установлено?

1 Ответ

0 голосов
/ 10 июня 2018

C ++ try / catch не перехватывает исключения Java.Вам нужно ExceptionCheck и ExceptionClear:

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

(обратите внимание, что вы должны использовать их для при каждом вызове JNI, который может привести к возникновению исключения Java)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...