博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JNI返回复杂对象之中的一个
阅读量:6160 次
发布时间:2019-06-21

本文共 3061 字,大约阅读时间需要 10 分钟。

需求:

首先说需求。近期接手一个项目。要在底层解析二进制数据,数据结构比較负责,因为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
> 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,"
","()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, "
","()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, "
","()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,"
","()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; }
以上这个是做的假数据,真实的数据自己去填充,做开发的一眼就懂的。

转载地址:http://qsefa.baihongyu.com/

你可能感兴趣的文章
[译]ECMAScript.next:TC39 2012年9月会议总结
查看>>
【Xcode】编辑与调试
查看>>
用tar和split将文件分包压缩
查看>>
[BTS] Could not find stored procedure 'mp_sap_check_tid'
查看>>
PLSQL DBMS_DDL.ALTER_COMPILE
查看>>
Activity生命周期
查看>>
高仿UC浏览器弹出菜单效果
查看>>
Ubuntu忘记密码,进不了系统的解决方法
查看>>
[原创]白盒测试技术思维导图
查看>>
<<Information Store and Management>> 读书笔记 之八
查看>>
Windows 8 开发之设置合约
查看>>
闲说HeartBeat心跳包和TCP协议的KeepAlive机制
查看>>
MoSQL
查看>>
Hibernate多对一外键单向关联(Annotation配置)
查看>>
《CLR via C#》读书笔记 之 方法
查看>>
设计模式:组合模式(Composite Pattern)
查看>>
ContentValues 和HashTable区别
查看>>
LogicalDOC 6.6.2 发布,文档管理系统
查看>>
给PowerShell脚本传递参数
查看>>
实战2——Hadoop的日志分析
查看>>