检查程序包是否安装在JNI C中的android设备上 我想检查C++中NDK代码中是否安装了特定的一组包,因为我不想用java代码检查,所以在研究之后我编写了java代码比较代码。我的代码检查packageinfo,若抛出异常,则将其视为未找到包。这是我的代码片段 jboolean checkpackages(JNIEnv *env, jobject context, char packagePaths[][MAX_STRING_SIZE], int size) { jstring packageName; jobject packageManagerObj; jobject packageInfoObj; jclass contextClass = env->GetObjectClass(context); jmethodID getPackageNameMid = env->GetMethodID(contextClass, "getPackageName", "()Ljava/lang/String;"); jmethodID getPackageManager = env->GetMethodID(contextClass, "getPackageManager", "()Landroid/content/pm/PackageManager;"); jclass packageManagerClass = env->FindClass("android/content/pm/PackageManager"); jmethodID getPackageInfo = env->GetMethodID(packageManagerClass, "getPackageInfo", "(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;"); jclass packageInfoClass = env->FindClass("android/content/pm/PackageInfo"); jfieldID versionCodeFid = env->GetFieldID(packageInfoClass, "versionCode", "I"); packageManagerObj = env->CallObjectMethod(context, getPackageManager); for (int i = 0; i < size; i++) { const char *path = packagePaths[i]; //packageName = env->NewStringUTF(path); jstring packageNamet = env->NewStringUTF("com.mypackgage"); packageInfoObj = env->CallObjectMethod(packageManagerObj, getPackageInfo, packageNamet, 0x0); int versionCode = env->GetIntField(packageInfoObj, versionCodeFid); if(env->ExceptionCheck()) { env->ExceptionClear(); __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "NATIVE: Package manager: Exception"); } else { return true; } } return false; }

检查程序包是否安装在JNI C中的android设备上 我想检查C++中NDK代码中是否安装了特定的一组包,因为我不想用java代码检查,所以在研究之后我编写了java代码比较代码。我的代码检查packageinfo,若抛出异常,则将其视为未找到包。这是我的代码片段 jboolean checkpackages(JNIEnv *env, jobject context, char packagePaths[][MAX_STRING_SIZE], int size) { jstring packageName; jobject packageManagerObj; jobject packageInfoObj; jclass contextClass = env->GetObjectClass(context); jmethodID getPackageNameMid = env->GetMethodID(contextClass, "getPackageName", "()Ljava/lang/String;"); jmethodID getPackageManager = env->GetMethodID(contextClass, "getPackageManager", "()Landroid/content/pm/PackageManager;"); jclass packageManagerClass = env->FindClass("android/content/pm/PackageManager"); jmethodID getPackageInfo = env->GetMethodID(packageManagerClass, "getPackageInfo", "(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;"); jclass packageInfoClass = env->FindClass("android/content/pm/PackageInfo"); jfieldID versionCodeFid = env->GetFieldID(packageInfoClass, "versionCode", "I"); packageManagerObj = env->CallObjectMethod(context, getPackageManager); for (int i = 0; i < size; i++) { const char *path = packagePaths[i]; //packageName = env->NewStringUTF(path); jstring packageNamet = env->NewStringUTF("com.mypackgage"); packageInfoObj = env->CallObjectMethod(packageManagerObj, getPackageInfo, packageNamet, 0x0); int versionCode = env->GetIntField(packageInfoObj, versionCodeFid); if(env->ExceptionCheck()) { env->ExceptionClear(); __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "NATIVE: Package manager: Exception"); } else { return true; } } return false; },android,c++11,android-ndk,ndk-build,Android,C++11,Android Ndk,Ndk Build,如果我把现有的软件包放到设备上,我的代码就可以工作。我使用的是Android studio 4.0.1和ndk 21.3。请帮助我如何处理这个问题或其他我们可以做的事情。至于getPackageInfo说,它可以抛出NameNotFoundException 直到GetIntField之后,您才检查任何异常,这意味着您可能会调用GetIntField,并出现挂起的异常,这是不允许的。我已经将代码放在try{}catch(std::exception){}中,但它不起作用,所以我搜索并得到了它来处

如果我把现有的软件包放到设备上,我的代码就可以工作。我使用的是Android studio 4.0.1和ndk 21.3。请帮助我如何处理这个问题或其他我们可以做的事情。

至于
getPackageInfo
说,它可以抛出
NameNotFoundException


直到
GetIntField
之后,您才检查任何异常,这意味着您可能会调用
GetIntField
,并出现挂起的异常,这是不允许的。

我已经将代码放在try{}catch(std::exception){}中,但它不起作用,所以我搜索并得到了它来处理ndk中的异常,如果(env->ExceptionCheck()){env->ExceptionClear();//在运行任何其他ndk代码之前清除异常。}所以在代码中使用了它。正如我所说的,在
GetIntField
之后才检查Java异常,但是在它可以抛出异常之前,
CallObjectMethod
检查Java异常是错误的,使用挂起的Java异常调用JNI函数是错误的。每次可以抛出异常的JNI调用之后,都需要检查并处理Java异常是的,Michael,正如我在上面的评论中提到的,我添加了代码int versionCode=env->GetIntField(PackageInfo对象,versionDefid);在try catch块中,但它没有进入catch块中,所以在研究之后,我知道要在ndk JNI c中处理异常,我们必须在语句下方进行检查,如果使用语句env->ExceptionCheck()发生异常,则可能会导致异常。try catch块不会被执行。Refered“在试捕区,但它没有进入捕捕区"因为C++中的代码>尝试/ catch < /COD>是用来捕获C++异常的。但是这里所处理的是java异常,C++没有什么概念。因此需要使用<代码>异常检查/发生/清除< /代码>。再次:仅在<代码> GETTunfield >之后检查java异常是不够的。每次都需要这样做。可能引发Java异常的JNI调用。
JNI DETECTED ERROR IN APPLICATION: JNI GetIntField called with pending exception android.content.pm.PackageManager$NameNotFoundException