2011-10-15 3 views
15

자바 네이티브 함수를 사용하고 있습니다 -C++/JNI에서 벡터를 jobject로 변환 하시겠습니까?

C++에서 내 기본 함수 -

vector<string> resultList; 

JNIEXPORT jobject JNICALL Java_Sample1_parseXML 
(JNIEnv *env, jobject obj){ 
    // logic 
    return resultList; // here getting error 
} 

제 문제는 resultList (벡터 형식)를 jobject 형식으로 변환하는 방법입니까?

+1

+1 : 당신이 상상할 수없는 것보다 훨씬 더 힘듭니다. ;) –

답변

13

C++에서 ArrayList에 대한 래퍼를 만들어야합니다. 뭔가 같은 : 자세한 내용은

vector <char*> vec; 

jclass clazz = (*env).FindClass("java/util/ArrayList"); 
jobject obj = (*env).NewObject(clazz, (*env).GetMethodID(clazz, "<init>", "()V")); 

for (int n=0;n<vec.size();n++) 
{ 
    char* str = (char*) static_cast<char*>(vec[n]); 

    jstring _str = (*env).NewStringUTF(str); 

    (*env).CallVoidMethod(object, (*env).GetMethodID(clazz, "add", "(java/lang/Object)V"), _str); 

} 

return obj; 

참조 :

http://download.oracle.com/javase/1.4.2/docs/guide/jni/spec/functions.html

+3

좋은 대답. 그러나 누군가가'java.util.List'를 구현하는 STL'vector'를위한 어댑터를 작성한다면 절대적으로 좋을 것입니다. 아주 매혹적인 운동! –

+0

오른쪽! 이것은 솔루션의 솔루션이 될 것입니다. – Dyonisos

+2

내 pedantry를 용서하지만,'(char *) static_cast '이 중복되지 않습니까? – moshbear

5

방법은 다음과 같습니다

bool add(Object); 

그래서 서명은 다음과 같습니다

"(Ljava/lang/Object;)Z" 

에서 추가 : http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/types.html#wp276

vector <char*> vec; 

jclass clazz = (*env).FindClass("java/util/ArrayList"); 
jobject obj = (*env).NewObject(clazz, (*env).GetMethodID(clazz, "<init>", "()V")); 
for (int n=0;n<vec.size();n++) 
{ 
    char* str = (char*) static_cast<char*>(vec[n]); 
    jstring _str = (*env).NewStringUTF(str); 
    (*env).CallBooleanMethod(object, (*env).GetMethodID(clazz, "add", "(Ljava/lang/Object;)Z"), _str); 
} 
return obj; 
+2

첫 번째 답변의 거의 문자 별 사본처럼 보입니다. – moshbear

+3

@moshbear : 그렇지 않습니다. 여기에'CallBooleanMethod','CallVoidMethod'가 있습니다. 나머지는 다소 기계적이어서 유사성이 예상됩니다. – Mat

+3

충분합니다. 이전 답변에 대한 내 의견 w.r.t. '(char *) static_cast '은 여전히 ​​중복되어 있습니다. – moshbear

관련 문제