2013-04-09 63 views
0

我有一个用C++编写的ListComplexType类型,它可以对从Android应用传递的文本进行一些解析。 ListComplexType类型包含一个std :: list,用MyComplexType填充。从C++通过ndk检索复杂对象到java的列表

现在我想输出列表中的MyComplexType对象的“名称”参数到android侧的简单ListView。

我该怎么做?我看了here

例子:

C++:

class ListComplexType{ 
private: 
    std::string jsonString;//For testing! 
    list<MyComplexType> myList; 

public: 
    ListComplexType(std::string jsonstring); 
    ~ListComplexType(); 
    void read(string jsonString); 
    std::string deserialize(); 

}; 

class MyComplexType{ 
public: 
    std::string name; 
    std::string phone; 
    Adress adress; 
}; 

class Adress{ 
public: 
    double house; 
    std::string street; 

}; 

JAVA:

json_parse(readJsonFile(getApplicationContext())); 
Debug.stopMethodTracing(); 
mainListView = (ListView) findViewById(R.id.mainListView);  

//RETRIEVE LIST FROM C++?  

listAdapter = new ArrayAdapter<String>(this, R.layout.simplerow, list); 
mainListView.setAdapter(listAdapter);   

回答

0

您可以将C++字符串复制到以下列方式Java数组:

的Java(易部分):

private native String [] getNames(); 

C++/JNI(硬部分):

#include <jni.h> 

static jclass Class_JavaString; 

JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) 
{ 
    JNIEnv* env = getEnv(); 

    cls = env->FindClass("java/lang/String"); 
    if (cls == NULL) 
     return JNI_ERR; 

    Class_JavaString = reinterpret_cast<jclass>(env->NewGlobalRef(cls)); 
    if (Class_JavaString == NULL) 
     return JNI_ERR;  

    return JNI_VERSION_1_6; 
} 

JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *vm, void *reserved) 
{ 
    JNIEnv *env = getEnv(); 
    env->DeleteGlobalRef(Class_JavaString); 
    return; 
} 

// To get correct signature for next function you can use 
// javah -bootclasspath /opt/android-sdk/platforms/android-8/android.jar -classpath bin/classes -d jni com.example.main.MyActivity 

JNIEXPORT jobjectArray JNICALL Java_com_example_main_MyActivity_getNames(JNIEnv * env, jobject) 
{ 
// copy std::list of std::strings into Java compatible object array 
// pListComplexType should be initialized somewhere to your instance of ListComplexType! 
jsize i = 0; 
jobjectArray jarray = env->NewObjectArray(pListComplexType->myList.size(), 
    Class_JavaString, NULL); 
list::iterator it,b,e; 
b = pListComplexType->myList.begin(); 
e = pListComplexType->myList.end(); 
for (it = b; it != e; ++it) { 
    jstring tmp = env->NewStringUTF((it->name).c_str()); 
    env->SetObjectArrayElement(jarray, i++, tmp); 
    env->DeleteLocalRef(tmp); 
} 
return jarray; 
} 
+0

有一种方法在同一时间,以提取其他字符串? – 2013-04-09 15:33:03

+0

您可以将'Class_JavaString'的想法扩展到更复杂的Java类(例如包含两个字符串的类),并相应地填充for-loop中的元素。 – 2013-04-09 15:50:16