【问题标题】:Retrieving a list of Complex objects to java from c++ through ndk通过ndk从c ++检索复杂对象列表到java
【发布时间】:2013-04-09 11:25:58
【问题描述】:

我有一个用 c++ 编写的 ListComplexType 类型,它对从 Android 应用程序传递的文本进行一些解析。 ListComplexType 类型包含一个 std::list,填充有 MyComplexType。

现在我想将列表中 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 );        

【问题讨论】:

    标签: java c++ android-ndk java-native-interface


    【解决方案1】:

    您可以通过以下方式将 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;
    }
    

    【讨论】:

    • 有没有办法同时提取其他字符串?
    • 您可以将Class_JavaString 的概念扩展为一些更复杂的Java 类(例如包含两个字符串的类)并相应地填充for 循环中的元素。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    • 2016-07-24
    相关资源
    最近更新 更多