很多时候写jni接口需要给java层返回复杂对象,如下面的java对象:
public class MapPoI { private int linkid ; private String name ; private float x ; private float y ; private int m_type; //构造函数,什么都不做 public MapPoI(){ } public MapPoI(String name, int linkid , float x, float y, int m_type){ this.linkid = linkid ; this.name = name ; this.x = x ; this.y = y ; this.m_type = m_type; }}
jni层:
JNIEXPORT jobject JNICALL Java_com_zongmu_valetparking_mapjni_MapJni_getMapPoiList(JNIEnv *env, jclass type, jint poi_type_) { std::vector<MapPOI> foundPoIs; //用来接收C++ vector 列表 foundPoIs = ZMMap::Instance()->GetPOI(); int count = foundPoIs.size(); jclass list_cls = env->FindClass("java/util/ArrayList");//获得ArrayList类引用 jmethodID list_costruct = env->GetMethodID(list_cls , "<init>","()V"); //获得得构造函数Id jobject list_obj = env->NewObject(list_cls , list_costruct); //创建一个Arraylist集合对象 //或得Arraylist类中的 add()方法ID,其方法原型为: boolean add(Object object) ; jmethodID list_add = env->GetMethodID(list_cls,"add","(Ljava/lang/Object;)Z"); jclass stucls = env->FindClass("com/zongmu/valetparking/model/MapPoI");//获得mappoi类引用 //获得该类型的构造函数 函数名为 <init> 返回类型必须为 void 即 V jmethodID stu_costruct = env->GetMethodID(stucls , "<init>", "(Ljava/lang/String;IFFI)V"); //注意 (Ljava/lang/String;IFFI)V 表示对象参数类型:string,int,float ,数量类型必须一致,douable为D
boolean | Z | byte | B | char | C |
short | S | int | I | long | J |
float | F | double | D | void | V |
java层调用:
ArrayList<MapPoI> poiList = MapJni.getMapPoiList(0); Log.d("ZmMapView","返回列表长度 listsize = "+poiList.size()); for(int i = 0 ; i < poiList.size() ; i++){ Log.d("ZmMapView"," 第 "+i+" 条POI信息 "+poiList.get(i).toString()); }