需求:

首先说需求。近期接手一个项目。要在底层解析二进制数据,数据结构比較负责,因为server是c++server,加之開始没有考虑到移动端开发,所以协议有点扯蛋。大体是这种,一个数据包里面是map里面放vector然后序列化成二进制!

ios的还好弄一点。object-c本身支持c++。简单封装就能够了。android的有点麻烦,须要把数据转成java的数据格式,问题来了。c++的数据接口大体是这种:

std::map<std::string,std::vector<struct info> > tmep;

问题:

要转换成java的数据对象。上网搜了一下,没有这方面的资料,有的基本都是一些简单的对象返回,没有这么复杂的,没法。自己动手做了,我的做法是这种:

在java里面声明一个对象类,例如以下:

public class ControlDictionaryValue {public String value;
}
public class LoginMsg extends BaseMsg {// 字典列表public HashMap<String, ArrayList<ControlDictionaryValue> > controlDictionary;
}

通过jni来返回这个对象,jni的代码例如以下:

JNIEXPORT jobject JNICALL Java_com_example_filltriangle_GL2JNILib_test(JNIEnv* env, jclass tis){jclass m_login_msg = env->FindClass("hzcw/msgdata/LoginMsg");jmethodID m_method_login_msg_init = env->GetMethodID(m_login_msg,"<init>","()V");jobject m_login_msg_obj = env->NewObject(m_login_msg, m_method_login_msg_init);jfieldID  m_fid_controlDictionary = env->GetFieldID(m_login_msg,"controlDictionary","Ljava/util/HashMap;");// new一个hashmap对象jclass class_hashmap=env->FindClass("java/util/HashMap");jmethodID hashmap_construct_method=env->GetMethodID(class_hashmap, "<init>","()V");jobject obj_hashmap =env->NewObject(class_hashmap, hashmap_construct_method, "");jmethodID hashmap_put_method= env->GetMethodID(class_hashmap,"put","(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");// new一个ArrayList对象jclass class_arraylist=env->FindClass("java/util/ArrayList");jmethodID arraylist_construct_method=env->GetMethodID(class_arraylist, "<init>","()V");jobject obj_arraylist =env->NewObject(class_arraylist, arraylist_construct_method, "");jmethodID arraylist_add_method= env->GetMethodID(class_arraylist,"add","(Ljava/lang/Object;)Z");// new一个ControlDictionaryValue对象jclass m_cls_ControlDictionaryValue = env->FindClass("hzcw/datastruct/ControlDictionaryValue");jmethodID m_mid_ControlDictionaryValue = env->GetMethodID(m_cls_ControlDictionaryValue,"<init>","()V");jobject m_obj_ControlDictionaryValue = env->NewObject(m_cls_ControlDictionaryValue, m_mid_ControlDictionaryValue, "");// 获取ControlDictionaryValue对象的value变量jfieldID  m_fid_ControlDictionaryValue_value = env->GetFieldID(m_cls_ControlDictionaryValue,"value","Ljava/lang/String;");env->SetObjectField(m_obj_ControlDictionaryValue,m_fid_ControlDictionaryValue_value,env->NewStringUTF("牙科"));env->CallBooleanMethod(obj_arraylist, arraylist_add_method, m_obj_ControlDictionaryValue);env->CallObjectMethod(obj_hashmap,hashmap_put_method,env->NewStringUTF((char*)"科室"), obj_arraylist);env->SetObjectField(m_login_msg_obj,m_fid_controlDictionary,obj_hashmap);env->DeleteLocalRef(m_obj_ControlDictionaryValue);  //删除局部引用env->DeleteLocalRef(obj_arraylist);  //删除局部引用env->DeleteLocalRef(obj_hashmap);  //删除局部引用return m_login_msg_obj;}

以上这个是做的假数据,真实的数据自己去填充,做开发的一眼就懂的。

转载于:https://www.cnblogs.com/claireyuancy/p/6820661.html

JNI返回复杂对象之中的一个相关推荐

  1. 后端返回数组对象(id重复)来去重并保留第一个

    后端返回数组对象(id重复)来去重并保留第一个1 var arr = [{ id: "0001", name: "张三" },{ id: "0001& ...

  2. 实现一个打点计时器,要求 1、从 start 到 end(包含 start 和 end),每隔 100 毫秒 console.log 一个数字,每次数字增幅为 1 2、返回的对象中需要包含一个 can

    实现一个打点计时器,要求 1.从 start 到 end(包含 start 和 end),每隔 100 毫秒 console.log 一个数字,每次数字增幅为 1 2.返回的对象中需要包含一个 can ...

  3. android jni 返回java类

    今天,简单讲讲android 在jni中如何返回一个java的类. 之前,我写了一些关于jni的博客,里面返回的都是简单的int类型,那么如果我需要返回很多int和String类型,那么怎么办呢?当然 ...

  4. android jni 调用java对象_Android NDK开发之Jni调用Java对象

    本地代码中使用Java对象 通过使用合适的JNI函数,你可以创建Java对象,get.set 静态(static)和 实例(instance)的域,调用静态(static)和实例(instance)函 ...

  5. python中id地址什么意思_id()在python中返回的对象地址是什么?

    在函数返回时有一个身份的识别,就像我们寄包裹的时候都有一个单号,便于大家随时跟踪它的进度.我们今天要讲的内置函数id()同样可以看作是用来进行身份识别的.那么我们进一步思考,id()最后返回的地址究竟 ...

  6. java byter是字节吗_GitHub - XXQAQ/Byter: 字节对象转换框架,一个基于字节的 Gson/FastJson...

    Byter 字节对象转换框架,一个基于字节的 Gson/FastJson 众所周知,Json数据的序列化内容就是字符串,如果说Gson/FastJson是基于字符串的Json转化框架,那么Byter就 ...

  7. js获取对象的最后一个

    Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用 for...in 循环遍历该对象时返回的顺序一致 (两者的主要区别是 一个 for-i ...

  8. C++通过引用来传递和返回类对象

    通常来讲,除非是迫不得已,否则最好不要采用传值的方式传递和返回对象,这是因为采用传值的方式传递和返回对象的过程中需要经历对象间的拷贝操作,这样会在一定程度上降低程序运行的效率,从而使得待处理数据量增大 ...

  9. 使用Jquery+EasyUI进行框架项目开发案例解说之中的一个---员工管理源代码分享

    使用Jquery+EasyUI 进行框架项目开发案例解说之中的一个 员工管理源代码分享 在開始解说之前,我们先来看一下什么是Jquery EasyUI?jQuery EasyUI是一组基于jQuery ...

  10. Android实训案例(七)——四大组件之中的一个Service初步了解,实现通话录音功能,抽调接口...

    Service Service的奇妙之处.在于他不须要界面,一切的操作都在后台操作,所以非常多全局性(手机助手,语音助手)之类的应用非常长须要这个.我们今天也来玩玩 我们新建一个project--Se ...

最新文章

  1. 维基百科上的算法和数据结构链接很强大
  2. 计算机计算能力,计算机/电脑为什么拥有计算能力
  3. powershell创建iis站点、应用程序及应用程序池
  4. bzoj 5090 组题
  5. win10系统的定位服务器,Win10系统无法开启定位功能的原因及解决方法
  6. 读懂LinkedList这一篇就够了
  7. 笔记本电脑下载python视频-学Python买什么笔记本电脑?
  8. Dapper.NET—轻量ORM
  9. javascript视频教程之《ECMA5核心+设计模式》
  10. 冈萨雷斯 数字图像处理 插图 打包下载 原tif版 + png版
  11. Acwing1183. 电力
  12. python print字体颜色 print背景颜色
  13. java 假设检验_Spark机器学习-Java版(二)-相关系数和假设检验
  14. 六轴机器人直角坐标系建立_知识篇-六轴机器人坐标
  15. Rest_FrameWork(3):Wrapping API views
  16. Matplotlib画折线图
  17. usb声卡驱动(六):usb声卡中的pcm打开和关闭
  18. 微金所获2015(行业)最具影响力品牌奖
  19. 手机斗鱼tv显示与服务器通讯失败,热门手机知识:斗鱼直播加载失败如何解决?解决斗鱼直播加载失败操作步骤...
  20. ant design vue的ApiSelect选择器使用注意点

热门文章

  1. 数据可视:让科幻走向现实
  2. Nginx https configuration backed Certbot
  3. 2014第7周1Web安全概念学习
  4. php5.3.3以后php-fpm进程管理方式
  5. Linux群常见问题整理(一)[转]
  6. java 出栈_Java开发中巧妙使用链表来实现模拟栈的入栈出栈操作
  7. wireshark学习使用
  8. endnote按照apa6th格式复制_使用Endnote进行文献引用
  9. 单台服务器最大支持多少连接数
  10. es 时间字段聚合_ES聚合命令