通过NDK调用意图并获得结果

时间:2016-10-30 21:06:57

标签: android android-intent android-ndk

我正在尝试使用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);

1 个答案:

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

我希望这更清楚。