我想通过从 C++ 代码调用 Android 方法来获取 Android 中已安装应用程序的列表。找到第一个方法 ( getPackageManager()
),但是 getInstalledApplications()
方法每次都是 nil。这里有什么问题?
JNIEXPORT jobject JNICALL Java_com_example_davidt_ndkexample_TestNdk_getListOfInstalledApps
(JNIEnv* env, jobject obj, jobject activity){
jclass contextWrapperClass = env->FindClass("android/content/ContextWrapper");
jmethodID getPackageManagerId = env->GetMethodID(contextWrapperClass,"getPackageManager","()Landroid/content/pm/PackageManager;");
if (getPackageManagerId == 0) {
fprintf(stderr, "packageManager() not found");
}
jobject pm = env->CallObjectMethod(activity, getPackageManagerId);
jclass PackageManagerClass = env->GetObjectClass(pm);
jmethodID getInstalledApplicationsId = env->GetMethodID(PackageManagerClass,"getInstalledApplications","(I)[Landroid/content/pm/ApplicationInfo;");
if (getInstalledApplicationsId == 0) {
fprintf(stderr, "getInstalledApplications() not found");
}
return env->CallObjectMethod(pm, getInstalledApplicationsId);
}
最佳答案
看起来您的签名描述符是错误的。我用javap工具查过了
javap -s -bootclasspath <Your SDK Installation Path>/platforms/android-25/android.jar android.content.pm.PackageManager
对于 getInstalledApplications 它返回
public abstract java.util.List<android.content.pm.ApplicationInfo> getInstalledApplications(int);
descriptor: (I)Ljava/util/List;
所以,在你的情况下,它必须是
jmethodID getInstalledApplicationsId = env->GetMethodID(PackageManagerClass,"getInstalledApplications","(I)Ljava/util/List");
关于java - 无法解析 JNIfunction : Android ndk,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40671266/