java - 无法解析 JNIfunction : Android ndk

标签 java android c++ android-ndk java-native-interface

我想通过从 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/

相关文章:

java - 您的内容必须有一个 id 属性为 'android.R.id.list' 错误的 ListView

android - 使用 Kotlin 和泛型进行数据绑定(bind)。错误 : incompatible types: Object cannot be converted to List

java - 本地 Java 应用程序 - 数据库选择

java - 使用 Spring Data JPA 的服务层中的 Crud 方法

java - RemoteActorRefProvider ClassNotFound

android - Cmake 无法在 qt creator/collect2 : error: ld 上编译简单的测试程序

Android Studio 问题 - 文件过早结束

c++ - 删除链表中的后面元素

c++ - 尝试传递一个 constexpr lambda 并使用它来显式指定返回类型

c++ - 基于模板的设计意见