2016-10-30 2 views
0

Android에서 인 텐트를 사용하여 NDK를 통해 이미지 경로를 얻으려고합니다. 갤러리에서 이미지를 고를 의도가 있습니다. NDK를 통해 어떻게 호출하고 결과를 C++로 되돌릴 수 있습니까? 아래 코드는 내 MainActivity 클래스의 일부입니다. 는 C++ 측면에서NDK를 통해 인 텐트를 호출하고 결과를 얻습니다.

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

나는 아래의 코드를 사용하여 의도를 호출 할 수 있지만, 어떻게하여 onActivityResult의 결과를 얻을 수 있나요? 내가 처음 실행을 얻는 것은 selectedFilePath의 빈 문자열이지만, 의도를 두 번째 호출 할 때는 전에 문자열을 가져옵니다. 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

보세요. http://stackoverflow.com/questions/5198105/calling-a-java-method-from-c-in-android. 받아 들여진 대답뿐 아니라 다른 것들도. 데이터를 양방향으로 전달하는 방법을 볼 수 있습니다. –

+0

활동 결과를 얻는 방법은 설명하지 않습니다. – sabotage3d

+0

예. 특히 http://stackoverflow.com/a/35976648/3866010. 클래스를 찾고 메소드를 찾으면 메소드를 호출하고 메소드가 객체를 리턴합니다. 따라서 사용자가 해당 인 텐트를 호출 한 후 이미지를 선택하면 이미지의 경로를 저장하고 해당 예제에 표시된 Java 메서드를 호출하는 위조 된 C/C++ 메서드를 호출해야합니다. –

답변

1

위의 코드에서 두 번째 네이티브 메서드가 있어야하는 이유가이 코드가 작동하지 않는 이유입니다. 그 두 번째 네이티브 메서드는 onActivityResult()에서 사용자가 파일을 선택한 후 호출 할 수 있습니다. 즉, getUserSelectedFile()이 호출되면 String에 이미 값이 있습니다.

참고 : 답변은 아래의 의견을 바탕으로 몇 번 편집되었습니다. 활동에

는 :

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

난이 명확 희망 :

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++)에서, 당신은이 두 가지 방법이 필요합니다.

+0

이 솔루션의 문제점 콜백으로 작용하지 않습니다. 내가 두 번째로 호출 할 때 빈 문자열입니다. 이전에 문자열을 가져 왔습니다. 기본적으로 나는 "pickImage"와 "getUserSelectedFile"을 C++의 같은 함수 내에서 호출합니다. – sabotage3d

+0

질문을 편집하고 시도한 내용을 게시 할 수 있습니까? 감사합니다 –

+0

@ sabotage3d 질문을 편집 해 주셔서 감사합니다. 내 대답을 편집했습니다. 'onActivityResult()'에 주석을 추가했기 때문에 모두 다시 읽습니다. –

관련 문제