2011-10-15 9 views
15

私はJavaのネイティブ機能を使用しています -C++/JNIのvectorをjobjectに変換しますか?

Cで
public native ArrayList<String> parseXML(); 

++私のネイティブ関数を -

vector<string> resultList; 

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

私の問題は、どのタイプをJOBJECTするresultList(ベクトル型)を変換することですか?

+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

私のペダントリーは大丈夫ですが、 '(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

関連する問題