JNI返回复杂对象之中的一个
需求:
首先说需求。近期接手一个项目。要在底层解析二进制数据,数据结构比較负责,因为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;
- }
以上这个是做的假数据,真实的数据自己去填充,做开发的一眼就懂的。
JNI返回复杂对象之中的一个的更多相关文章
- 常用代码之五:RequireJS, 一个Define需要且只能有一个返回值/对象,一个JS文件里只能放一个Define.
RequireJS 介绍说一个JS文件里只能放一个Define,这个众所周知,不提. 关于Define,它需要有一个返回值/对象,且只能有一个返回值/对象,这一点却是好多帖子没有提到的,但又非常重要的 ...
- Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象。
Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象. 语法EDIT Object.defineProperty(obj, ...
- C++ //拷贝构造函数调用时机//1.使用一个已经创建完毕的对象来初始化一个新对象 //2.值传递的方式给函数参数传值 //3.值方式返回局部对象
1 //拷贝构造函数调用时机 2 3 4 #include <iostream> 5 using namespace std; 6 7 //1.使用一个已经创建完毕的对象来初始化一个新对象 ...
- Android NDK开发之Jni调用Java对象
https://my.oschina.net/zhiweiofli/blog/114064 通过使用合适的JNI函数,你可以创建Java对象,get.set 静态(static)和 实例(instan ...
- JNI函数复杂对象传递
主要操作内容,包括如下几个部分: 1.在Native层返回一个字符串 2.从Native层返回一个int型二维数组(int a[ ][ ]) 3.从Native层操作Java层的类: 读取/设置类属性 ...
- 在存放源程序的文件夹中建立一个子文件夹 myPackage。例如,在“D:\java”文件夹之中创建一个与包同名的子文件夹 myPackage(D:\java\myPackage)。在 myPackage 包中创建一个YMD类,该类具有计算今年的年份、可以输出一个带有年月日的字符串的功能。设计程序SY31.java,给定某人姓名和出生日期,计算该人年龄,并输出该人姓名、年龄、出生日期。程序使用YM
题目补充: 在存放源程序的文件夹中建立一个子文件夹 myPackage.例如,在“D:\java”文件夹之中创建一个与包同名的子文件夹 myPackage(D:\java\myPackage).在 m ...
- Canvas基础知识总结之中的一个
canvas的HTML语法: <canvas> Canvas not supported </canvas> 上面这句代码中内容部分所含的文本,这种文本的叫法"后备内 ...
- 奇妙的动态代理:EF中返回的对象为什么序列化失败
今天有如鹏的学生遇到一个问题:把一个对象保存到Session中(进程外Session)后,Web服务器重启,当从Session读取这个对象的时候报错,提示是一个“T_Users”后面跟着一大串数字的类 ...
- Git.Framework 框架随手记--ORM查询返回实体对象
使用ORM有一个优势,可以通过某种机制将数据库中的数据转化为自己想要的对象形式数据.本章记录一下如何使用Git.Framework返回实体对象 一. Git.Framework 中提供的方法 在Git ...
随机推荐
- python 06 8/28-8/30
六 函数的返回值,使用return返回数据,可以同时返回多个数据,将会以元组的形式返回到函数的调用处.return 具有返回数据和中止程序的作用! return 后不加任何数据则返回None ,判定为 ...
- HTML、CSS 和 JS框架之Bootstrap
一.Bootstrap简介: Bootstrap 是最受欢迎的 HTML.CSS 和 JS 框架,用于开发响应式布局.移动设备优先的 WEB 项目. 详细参考内容:Bootstrap_v3 二.Boo ...
- 04--activiti demo
核心API1:ProcessEngine说明:1) 在Activiti中最核心的类,其他的类都是由他而来.2) 产生方式: ProcessEngine processEngine = ProcessE ...
- 【HIHOCODER 1043】题目1 : 完全背包
描述 且说之前的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励的时刻了! 等等,这段故事为何似曾相识?这就要从平行宇宙理论说起了---总而言之,在另一个宇宙中,小 ...
- Vijos1144 皇宫看守 (0/1/2三种状态的普通树形Dp)
题意: 给出一个树以及一些覆盖每个点的花费,求每个点都能被自己被覆盖,或者相邻的点被覆盖的最小价值. 细节: 其实我乍一眼看过去还以为是 战略游戏 的复制版 可爱的战略游戏在这里QAQ(请原谅这波广告 ...
- JSP表达式语言(EL)
JSP表达式语言(EL)使得访问存储在JavaBean中的数据变得非常简单.JSP EL既可以用来创建算术表达式也可以用来创建逻辑表达式.在JSP EL表达式内可以使用整数型.浮点型.字符串.常量 ...
- BNUOJ 1575 Supermarket
Supermarket Time Limit: 2000ms Memory Limit: 65536KB This problem will be judged on PKU. Original ID ...
- hdu1856 选出更多的孩子
题目大意: 老师选取2个学生对应的号码,这两人视作朋友,同时朋友的朋友也可以看成自己的朋友. 最后老师选出一个人数最多的朋友圈. 这里学生的人数不大于10^7,所以操作时需要极为注意,操作步数能省则省 ...
- 【博弈+GCD】C. Alice and Bob
https://www.bnuoj.com/v3/contest_show.php?cid=9147#problem/C [题意] 初始时有n个数,定义操作为从n个数中取出两个数x,y,如果|x-y| ...
- 【DFS】codeforces B. Sagheer, the Hausmeister
http://codeforces.com/contest/812/problem/B [题意] 有一个n*m的棋盘,每个小格子有0或1两种状态,现在要把所有的1都变成0,问最少的步数是多少?初始位置 ...