传递,返回并转换为JNI的列表的向量列表 [英] Pass, return and convert to vectors list of lists over JNI

查看:222
本文介绍了传递,返回并转换为JNI的列表的向量列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要从Java传递

  List<列表< MyPoint> >点数; 

超过jni到C ++并转换为

  std :: vector< std :: vector< MyPoint> > 

处理此载体并返回

  List<列表< MyPoint> > 




  1. 如何正确传递和返回列表清单?

  2. 如何在对象向量向量中转换对象列表,并向后?


解决方案<


  1. 在Java类中创建对象(O)容器(C) li>
  2. 将对象(O)数组从Java代码传递到本机部分

  3. 使用C ++代码从数组向量创建

  4. 计算新向量

  5. 构建容器数组(C)并插入对象(O)

  6. 返回容器数组>

代码实现




1 - 从点列表创建数组

p>

2 - 构建输入向量



  std :: vector< CurvePoint> src_line; 

jclass java_points_cls = env-> FindClass(myPointClass);
jmethodID java_mid = env-> GetMethodID(java_points_cls,< init>,(II)V);
jfieldID fidX = env-> GetFieldID(java_points_cls,x,I);
jfieldID fidY = env-> GetFieldID(java_points_cls,y,I);

int srcCount = env-> GetArrayLength(srcLines);

for(int i = 0; i {
jobject cur_pnt = env-> GetObjectArrayElement(srcLines,i);

LinePoint src_point;

src_point.x = env-> GetIntField(cur_pnt,fidX);
src_point.y = env-> GetIntField(cur_pnt,fidY);

src_line.push_back(src_point);
}

3 - 计算



4 - 构建输出数组

$ p> jclass java_line_cls = env-> FindClass(myLinesClass);

jmethodID java_line_add = env-> GetMethodID(java_line_cls,addPoint,(II)V);
jmethodID java_line_init = env-> GetMethodID(java_line_cls,< init>,()V);

jobjectArray resLines =(jobjectArray)env-> NewObjectArray(lines.size(),java_line_cls,0);

for(int i = 0; i< lines.size(); ++ i)
{
jobject cur_line = env-> NewObject(java_line_cls,java_line_init) ;
for(int j = 0; j< lines [i] .size(); ++ j)
env-> CallVoidMethod(cur_line,java_line_add,
lines [i] j] .x,
lines [i] [j] .y);
env-> SetObjectArrayElement(resLines,i,cur_line);
}

return resLines;

Java零件



5 - 从返回的数组中创建行列表


I need to pass from Java

List< List<MyPoint> > points;

over jni to C++ and convert to

std::vector< std::vector<MyPoint> >

Process this vectors and return

List< List<MyPoint> >

  1. How correct pass and return list of lists?
  2. How convert list of lists of objects in vector of vectors of objects and backward?

解决方案

I solved this problem with standard tools.

  1. Create in Java class as objects (O) container (C)
  2. Pass array of objects (O) from Java code to native part
  3. Create from array vector in C++ code
  4. Calculate new vectors
  5. Build array of containers (C) and insert into objects (O)
  6. Return array of containers (C)

Code implement:

On java part:

1 - Create array from list of points

On c++ part:

2 - build input vector

std::vector<CurvePoint> src_line;

jclass java_points_cls = env->FindClass("myPointClass");
jmethodID java_mid = env->GetMethodID(java_points_cls, "<init>", "(II)V");    
jfieldID fidX = env->GetFieldID(java_points_cls, "x", "I");
jfieldID fidY = env->GetFieldID(java_points_cls, "y", "I");

int srcCount = env->GetArrayLength(srcLines);

for (int i=0; i < srcCount; i++) 
{
    jobject cur_pnt =  env->GetObjectArrayElement(srcLines, i); 

    LinePoint src_point;        

    src_point.x = env->GetIntField(cur_pnt, fidX); 
    src_point.y = env->GetIntField(cur_pnt, fidY);    

    src_line.push_back(src_point);
}

3 - calculation lines

4 - build output array

jclass java_line_cls = env->FindClass("myLinesClass");

jmethodID java_line_add = env->GetMethodID(java_line_cls, "addPoint", "(II)V");  
jmethodID java_line_init = env->GetMethodID(java_line_cls, "<init>", "()V");

jobjectArray resLines = (jobjectArray) env->NewObjectArray(lines.size(),     java_line_cls, 0); 

for(int i = 0; i < lines.size(); ++i)
{
    jobject cur_line =  env->NewObject(java_line_cls, java_line_init);
    for(int j = 0; j < lines[i].size(); ++j)
        env->CallVoidMethod(cur_line, java_line_add, 
                                lines[i][j].x,
                                lines[i][j].y);
    env->SetObjectArrayElement(resLines, i, cur_line);
}

return resLines;

Java part

5 - Create list of lines from returned array

这篇关于传递,返回并转换为JNI的列表的向量列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆