JNI开发-Java从C/C++获取List集合对象
NI开发有时需要Java从C/C++获取List对象,此篇主要讲解Java从C/C++获取List<Student>返回值; 1. 定义com.niubashaoye.simple.jni.StuInfo类 public class StuInfo {
private int stuId;
private String stuName;
private int stuAge;
private String className; public StuInfo(int stuId, String stuName, int stuAge, String className) {
super();
this.stuId = stuId;
this.stuName = stuName;
this.stuAge = stuAge;
this.className = className;
} //getter()
//setter() @Override
public String toString() {
return "StuInfo [stuId=" + stuId + ", stuName=" + stuName + ", stuAge=" + stuAge + ", className=" + className
+ "]";
} } 2. 添加native函数 public class JNITools {
static {
System.loadLibrary("TestDemo");
}
/**
* 从C获取list
*
* @return
*/
public native List<StuInfo> getStuList();
} * 从C获取list
*
* @return
*/
public native List<StuInfo> getStuList();
} 3. C/C++文件 3.1 添加StuInfo结构体 typedef struct {
int stuId;
char stuName[50];
int stuAge;
char className[50];
} StuInfo; 3.2 获取List<StuInfo>对象 JNIEXPORT jobject JNICALL Java_com_niubashaoye_simple_jni_JNITools_getStuList(
JNIEnv *env, jobject obj) { //获取ArrayList类引用
jclass list_jcs = env->FindClass("java/util/ArrayList");
if (list_jcs == NULL) {
LOGI("ArrayList no find!");
return NULL;
}
//获取ArrayList构造函数id
jmethodID list_init = env->GetMethodID(list_jcs, "<init>", "()V");
//创建一个ArrayList对象
jobject list_obj = env->NewObject(list_jcs, list_init, "");
//获取ArrayList对象的add()的methodID
jmethodID list_add = env->GetMethodID(list_jcs, "add",
"(Ljava/lang/Object;)Z");
//获取StuInfo类
jclass stu_cls = env->FindClass("com/niubashaoye/simple/jni/StuInfo");
//获取StuInfo的构造函数
jmethodID stu_init = env->GetMethodID(stu_cls, "<init>",
"(ILjava/lang/String;ILjava/lang/String;)V"); StuInfo stuInfo;
stuInfo.stuId = 100001;
stuInfo.stuAge = 20;
const char *name = "牛八少爷";
strcpy(stuInfo.stuName, name);
const char *className = "高三六班";
strcpy(stuInfo.className, className); for (int i = 0; i < 4; i++) {
LOGI("第%d个学生信息:id=%d,name=%s,age=%d,className=%s", i + 1,
(stuInfo.stuId + i), stuInfo.stuName, (stuInfo.stuAge + i),
stuInfo.className);
//通过StuInfo的构造函数创建StuInfo对象
jobject stu_obj = env->NewObject(stu_cls, stu_init, (stuInfo.stuId + i),
env->NewStringUTF(stuInfo.stuName), (stuInfo.stuAge + i * 5),
env->NewStringUTF(stuInfo.className)); env->CallBooleanMethod(list_obj, list_add, stu_obj);
}
return list_obj;
} JNIEnv *env, jobject obj) { //获取ArrayList类引用
jclass list_jcs = env->FindClass("java/util/ArrayList");
if (list_jcs == NULL) {
LOGI("ArrayList no find!");
return NULL;
}
//获取ArrayList构造函数id
jmethodID list_init = env->GetMethodID(list_jcs, "<init>", "()V");
//创建一个ArrayList对象
jobject list_obj = env->NewObject(list_jcs, list_init, "");
//获取ArrayList对象的add()的methodID
jmethodID list_add = env->GetMethodID(list_jcs, "add",
"(Ljava/lang/Object;)Z");
//获取StuInfo类
jclass stu_cls = env->FindClass("com/niubashaoye/simple/jni/StuInfo");
//获取StuInfo的构造函数
jmethodID stu_init = env->GetMethodID(stu_cls, "<init>",
"(ILjava/lang/String;ILjava/lang/String;)V"); StuInfo stuInfo;
stuInfo.stuId = 100001;
stuInfo.stuAge = 20;
const char *name = "牛八少爷";
strcpy(stuInfo.stuName, name);
const char *className = "高三六班";
strcpy(stuInfo.className, className); for (int i = 0; i < 4; i++) { LOGI("第%d个学生信息:id=%d,name=%s,age=%d,className=%s", i + 1,
(stuInfo.stuId + i), stuInfo.stuName, (stuInfo.stuAge + i),
stuInfo.className);
//通过StuInfo的构造函数创建StuInfo对象
jobject stu_obj = env->NewObject(stu_cls, stu_init, (stuInfo.stuId + i),
env->NewStringUTF(stuInfo.stuName), (stuInfo.stuAge + i * 5),
env->NewStringUTF(stuInfo.className)); env->CallBooleanMethod(list_obj, list_add, stu_obj);
}
return list_obj;
} 4. Java调用native函数 List<StuInfo> stuList = jniTools.getStuList();
Toast.makeText(getApplicationContext(), stuList.toString(), Toast.LENGTH_SHORT).show(); List<StuInfo> stuList = jniTools.getStuList();
Toast.makeText(getApplicationContext(), stuList.toString(), Toast.LENGTH_SHORT).show(); 代码下载:https://download.csdn.net/download/niuba123456/10533712
JNI开发-Java从C/C++获取List集合对象的更多相关文章
- Java创建List、Map等集合对象的同时进行赋值操作
title: Java创建List.Map等集合对象的同时进行赋值操作 date: 2019-11-28 23:25:47 tags: JavaSE categories: JavaSE 问题简介 ...
- 《纵向切入ASP.NET 3.5控件和组件开发技术》笔记:高效率事件集合对象
在之前讲的几个例子中,使用的是最普通的定义事件方法,比如KingTextBox中事件是这样定义的:/// <summary>/// 获得本书更多内容,请看:/// http://blog. ...
- 获取List集合对象中某一列属性值
例:获取disposeList集合中CorpusMarkPage对象中的responseId属性,生成新的List集合 List<String> responseIdList = disp ...
- Salesforce中通过SOAP API和Metadata API开发java的web server服务
1.下载Salesforce平台中WSDL文件 在Salesforce中创建了自己需要用到的对象后,我们想要在别的应用中读写纪录到对象中,首先需要的是自己Salesforce平台的权限通过.登陆自己的 ...
- 使用Eclipse/MyEclipse开发Java程序
集成开发环境(IDE)是一类软件 将程序开发环境和程序调试环境集合在一起,提高开发效率 下载eclipse安装包网址:http://www.eclipse.org/downloads/ **MyEcl ...
- java中Comparator的用法 -- 实现集合和数组排序
在java中,如果要对集合对象或数组对象进行排序,需要实现Comparator接口以达到我们想要的目标. 接下来我们模拟下在集合对象中对日期属性进行排序 一.实体类Step package com.l ...
- Android Studio NDK开发-JNI调用Java方法
相对于NDK来说SDK里面有更多API可以调用,有时候我们在做NDK开发的时候,需要在JNI直接Java中的方法和变量,比如callback,系统信息等.... 如何在JNI中调用Java方法呢?就需 ...
- Android NDK开发 JNI操作java构造方法,普通方法,静态方法(七)
Android NDK开发 JNI操作java普通.静态.构造方法 1.Jni实例化一个Java类的实例jobject 1.通过FindClas( ),获取Java类的的jclass 2.通过GetM ...
- 第七篇 :微信公众平台开发实战Java版之如何获取微信用户基本信息
在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的.对于不同公众号,同一用户的openid不同). 公众号可通过本接口来根据O ...
随机推荐
- An Example of How Oracle Works
Oracle是怎么工作的,摘自Oracle 9i的官方文档 The following example describes the most basic level of operations tha ...
- log buffer space等待事件
最近,我们有台服务器在delete操作期间发现一直在等待log buffer space,其他节点就没与这个问题.经查,向重做缓冲区上写入重做记录的进程,为了确保拥有重做缓冲区内必要的空间,需要获得r ...
- 如何搭建一个 MySQL 分布式集群
1.准备集群搭建环境 使用6台虚拟机来搭建 MySQL分布式集群 ,相应的实验环境与对应的MySQL节点之间的对应关系如下图所示: 管理节点(MGM):这类节点的作用是管理MySQLCluster内的 ...
- ldap集成nginx
nginx版本:1.10.2 nginx安装: wget http://nginx.org/download/nginx-1.10.2.tar.gz tar zxvf nginx-1.10.2.tar ...
- 如何写好接口(php写app移动端接口示例)
原文链接:https://blog.csdn.net/xwh670570759/article/details/52130585?utm_source=blogxgwz0
- volatile的陷阱
对于volatile关键字,大部分C语言的教程都是一笔带过,并没有做太深入的分析,所以这里简单的整理了一些 关于volatile的使用注意事项.实际上从语法上来看volatile和const ...
- EGIT
https://jingyan.baidu.com/article/64d05a0262f013de55f73bcc.html
- GC 垃圾收集
算法: 没有使用引用计数算法.使用的是GC Roots 可达性算法. 复制算法:新生代,老年代. 标记-整理算法:一般会对对象标记几次才会清理掉.然后从新整理物理内存空间. 分代收集算法:更加对象存活 ...
- 什么是SpringCloud
SpringCloud是在SpringBoot的基础上构建的,用于简化分布式系统构建的工具集. 该工具集为微服务架构中所涉及的配置管理,服务发现,智能路由,断路器,微代理和控制总线等操作 提供了一种简 ...
- Netty Reactor 线程模型笔记
引用: https://www.cnblogs.com/TomSnail/p/6158249.html https://www.cnblogs.com/heavenhome/articles/6554 ...