android - 检测是否安装了应用程序,不返回 false
问题描述
我试图从 jni 调用 java,不工作,我做错了什么。
#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)
如何修复并返回未安装的错误应用程序?
解决方案
C++ 的try
/catch
不会捕获 Java 异常。你需要的是ExceptionCheck
和ExceptionClear
:
env->CallObjectMethod(package_manager, methodId_pm, pkg, 0);
if (env->ExceptionCheck()) {
env->ExceptionClear();
return 0;
}
return 1;
(请注意,您应该将这些用于可能导致抛出 Java 异常的每个JNI 调用)
推荐阅读
- python - python中while循环中randrange()的空范围
- javascript - Javascript 输入字段值
- java - Java ee,JPA 2.1 重新返回 null
- c++ - 在 C++ 中手动调整数组大小
- html - 如何在高度为零的div边框内写入
- javascript - youtube 嵌入视频自动播放不适用于谷歌浏览器中未静音的声音,但它适用于 Firefox
- makefile - SDL + 花栗鼠 CMake 配置
- java - 即使在Java中初始化子类后,静态变量的值也不会改变
- c# - XMLSCHemaSet.Add 在 Visual Studio 2017 中失败
- excel - 如何在不打开 Visual Basic 编辑器的情况下执行 VBA 代码