android - 在 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 DETECTED ERROR IN APPLICATION: JNI GetIntField called with pending exception android.content.pm.PackageManager$NameNotFoundException
如果我将现有包放在设备上,我的代码就可以工作。我使用的是 Android Studio 4.0.1 和 ndk 21.3。请帮助我如何处理这个或我们可以做的任何其他方式。
解决方案
正如文档getPackageInfo
所说,它可以抛出一个NameNotFoundException
.
在 after 之前您不会检查任何异常GetIntField
,这意味着您最终可能会调用GetIntField
挂起的异常,这是不允许的。
推荐阅读
- javascript - 防止 redux 存储值在组件中再次被使用
- javascript - 如何在多页 vue 应用程序中的页面之间传输状态?
- gradle - 为什么 Gradle 开始报告“不匹配的版本”
- html - 如何将div放在中间?
- c# - 查看模型未更新
- pandas - PandasUDF 可以接受一系列类型的字符串并返回一系列类型的数组吗?
- regex - 如何使用一个捕获组获取单独的组
- python - 如何使用 Python 中未记录的 API 或未记录的 MQTT 消息协议发送 Instagram Direct 消息?
- file - Hexeditor,允许在数据中查找文件
- python - 为什么我的调优模型的得分明显非最优(负)?