我正在尝试使用Android中的意图通过NDK获取图像路径。 我有下面的意图,将从图库中选择一个图像。如何通过NDK调用它并将结果返回到C ++中?下面的代码是我的MainActivity类的一部分。
public void pickImage(Activity activity)
{
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Image"), 200 );
}
String selectedFilePath = "";
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Uri path = data.getData();
selectedFilePath = path.toString();
}
public String getUserSelectedFile() {
return selectedFilePath;
}
在C ++方面,我可以使用下面的代码调用intent,但是如何从onActivityResult获取结果?我在第一次运行时获得的是来自selectedFilePath的空字符串,但是当我第二次调用intent时,我从之前获取字符串。我认为pickImage阻塞了getUserSelectedFile。
jclass clazz(env->GetObjectClass(activity));
jmethodID method_id = env->GetMethodID(clazz, "pickImage", "()V");
env->CallVoidMethod(activity, method_id);
jmethodID method_id2 = env->GetMethodID(clazz, "getUserSelectedFile", "()Ljava/lang/String;");
jobject result = env->CallObjectMethod(activity, method_id2);
const char *strReturn = env->GetStringUTFChars((jstring) result, 0);
答案 0 :(得分:1)
这不适合你的原因是你需要为我上面给出的代码提供一个SECOND本机方法。第二个本机方法,你可以从onActivityResult()调用AFTER用户选择文件。这意味着当调用getUserSelectedFile()时,String将已经具有值。
注意:根据以下评论编辑答案几次。
在您的活动中:
String selectedFilePath = "";
static {
System.loadLibrary("your_lib_name");
}
public native void getImagePath();
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 200 && resultCode == RESULT_OK && data != null) {
Uri pickedImage = data.getData();
String[] filePath = { MediaStore.Images.Media.DATA };
Cursor cursor = getContentResolver().query(pickedImage, filePath, null, null, null);
cursor.moveToFirst();
selectedFilePath = cursor.getString(cursor.getColumnIndex(filePath[0]));
cursor.close();
getImagePath(); // this is your native method that will invoke getUserSelectedFile()
}
}
public void pickImage(Activity activity) {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Image"), 200 );
}
private static String getUserSelectedFile() {
return selectedFilePath;
}
然后在本机(C / C ++)中,您需要以下两种方法:
void Java_com_my_package_name_pickImage(JNIEnv *env, jobject obj) {
jclass clazz(env->GetObjectClass(activity));
jmethodID method_id = env->GetMethodID(clazz, "pickImage", "()V");
env->CallVoidMethod(activity, method_id);
}
void Java_com_my_package_name_getImagePath(JNIEnv *env, jobject obj) {
jclass clazz(env->GetObjectClass(activity));
jmethodID method_id2 = env->GetMethodID(clazz, "getUserSelectedFile", "()Ljava/lang/String;");
jobject result = env->CallObjectMethod(activity, method_id2);
const char *strReturn = env->GetStringUTFChars((jstring) result, 0);
}
我希望这更清楚。