Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android上的DCIM目录路径-返回值_Android_C++_Android Ndk_Java Native Interface - Fatal编程技术网

Android上的DCIM目录路径-返回值

Android上的DCIM目录路径-返回值,android,c++,android-ndk,java-native-interface,Android,C++,Android Ndk,Java Native Interface,我需要从本机代码中获取DCIM目录路径。我正在使用以下代码段: jclass envClass = env->FindClass("android/os/Environment"); char charParam[] = "Environment.DIRECTORY_DCIM"; jstring jstrParam = env->NewStringUTF(charParam); jmethodID getExtStorageDirectoryMethod = env->GetS

我需要从本机代码中获取DCIM目录路径。我正在使用以下代码段:

jclass envClass = env->FindClass("android/os/Environment");
char charParam[] = "Environment.DIRECTORY_DCIM";
jstring jstrParam = env->NewStringUTF(charParam);
jmethodID getExtStorageDirectoryMethod = env->GetStaticMethodID(envClass, "getExternalStoragePublicDirectory",  "(Ljava/lang/String;)Ljava/io/File;");
jobject extStorageFile = env->CallStaticObjectMethod(envClass, getExtStorageDirectoryMethod, jstrParam);
jclass fileClass = env->FindClass("java/io/File");
jmethodID getPathMethod = env->GetMethodID(fileClass, "getPath", "()Ljava/lang/String;");
jstring extStoragePath = (jstring)env->CallObjectMethod(extStorageFile, getPathMethod);
const char* extStoragePathString = env->GetStringUTFChars(extStoragePath,NULL);

//use extStoragePathString
LOGI("DCIM_PATH ==================================== %s", extStoragePathString);
但结果总是
[PATH\u TO\u SD\u CARD]/Environment.DIRECTORY\u DCIM
。我检查了这是一对设备以及模拟器。我在emulator上创建了DCIM目录。SD卡路径正确


作为一个解决方案,我可以一直在SD卡上搜索DCIM目录。因为无论如何,在DCIM下,我必须搜索图片的位置。但是,为什么我不能获取DCIM的路径呢?

环境。DIRECTORY\u DCIM
是DCIM文件夹的
环境中类的限定Java名称。但是,它不是字符串的实际值,它只是:

您需要传递字符串值,而不是变量的Java名称,因此您可以像这样更改代码:

char charParam[] = "DCIM";
jfieldID fieldId = env->GetStaticFieldID(envClass, "DIRECTORY_DCIM", "Ljava/lang/String;");
jstring jstrParam = (jstring)env->GetStaticObjectField(envClass, fieldId);
将此值作为参数传递等同于调用:

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
在Java中,给定
Environment.DIRECTORY\u DCIM
被定义为“DCIM”

但是,如果不想使用硬编码值,可以从
环境
类中查找静态字段,如下所示:

char charParam[] = "DCIM";
jfieldID fieldId = env->GetStaticFieldID(envClass, "DIRECTORY_DCIM", "Ljava/lang/String;");
jstring jstrParam = (jstring)env->GetStaticObjectField(envClass, fieldId);