2016-11-18 19 views
1

AndroidのメソッドをC++コードから呼び出して、Androidにインストールされているアプリのリストを取得します。見つかった最初のメソッド(getPackageManager())が、毎回getInstalledApplications()メソッドがnilです。ここで何が間違っていますか?JNI関数を解決できませんでした:Android ndk

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); 
} 

答えて

1

シグネチャディスクリプタが間違っているようです。私は

javap -s -bootclasspath <Your SDK Installation Path>/platforms/android-25/android.jar android.content.pm.PackageManager 

にそれをチェックするためてjavapツールを使用していたと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"); 
+0

サンキューなければなりません。あなたが正しいです。 –

関連する問題