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集合对象的更多相关文章

  1. Java创建List、Map等集合对象的同时进行赋值操作

    title: Java创建List.Map等集合对象的同时进行赋值操作 date: 2019-11-28 23:25:47 tags: JavaSE categories: JavaSE 问题简介   ...

  2. 《纵向切入ASP.NET 3.5控件和组件开发技术》笔记:高效率事件集合对象

    在之前讲的几个例子中,使用的是最普通的定义事件方法,比如KingTextBox中事件是这样定义的:/// <summary>/// 获得本书更多内容,请看:/// http://blog. ...

  3. 获取List集合对象中某一列属性值

    例:获取disposeList集合中CorpusMarkPage对象中的responseId属性,生成新的List集合 List<String> responseIdList = disp ...

  4. Salesforce中通过SOAP API和Metadata API开发java的web server服务

    1.下载Salesforce平台中WSDL文件 在Salesforce中创建了自己需要用到的对象后,我们想要在别的应用中读写纪录到对象中,首先需要的是自己Salesforce平台的权限通过.登陆自己的 ...

  5. 使用Eclipse/MyEclipse开发Java程序

    集成开发环境(IDE)是一类软件 将程序开发环境和程序调试环境集合在一起,提高开发效率 下载eclipse安装包网址:http://www.eclipse.org/downloads/ **MyEcl ...

  6. java中Comparator的用法 -- 实现集合和数组排序

    在java中,如果要对集合对象或数组对象进行排序,需要实现Comparator接口以达到我们想要的目标. 接下来我们模拟下在集合对象中对日期属性进行排序 一.实体类Step package com.l ...

  7. Android Studio NDK开发-JNI调用Java方法

    相对于NDK来说SDK里面有更多API可以调用,有时候我们在做NDK开发的时候,需要在JNI直接Java中的方法和变量,比如callback,系统信息等.... 如何在JNI中调用Java方法呢?就需 ...

  8. Android NDK开发 JNI操作java构造方法,普通方法,静态方法(七)

    Android NDK开发 JNI操作java普通.静态.构造方法 1.Jni实例化一个Java类的实例jobject 1.通过FindClas( ),获取Java类的的jclass 2.通过GetM ...

  9. 第七篇 :微信公众平台开发实战Java版之如何获取微信用户基本信息

    在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的.对于不同公众号,同一用户的openid不同). 公众号可通过本接口来根据O ...

随机推荐

  1. js输出

    JavaScript 可以通过4种不同的方式在html页面输出数据 1.使用window.alert() 弹出警告框,由于window为js的内置类,可简写为alter() <script> ...

  2. 统计py文件中的代码行

    希望是输入一个合法的文件夹的路径,然后代码自动读取该文件夹下的每个py结尾的文件内的代码行数,最后汇总一个数,但现在只是有思路,却没时间写,这是能读取同级文件下的某个文件, with open('te ...

  3. 07:vue定义路由

    1.1 定义路由 1.说明 1. 路由是单页面应用程序(SPA)的关键,Vue提供过来路由插件,使用这个路由就要安装这个插件 2. 安装: npm install vue-router 3. 依赖于v ...

  4. python简说(二十五)面向对象

    面向对象编程: 类 一个种类.一个模型 实例.实例化.对象 实例.对象: 根据模型制作出来的东西. 实例化: 就是做东西的这个过程. class My: my=My() 私有 方法 类里面的函数 属性 ...

  5. javaScript中ajax、axios总结

    一.原生js实现ajax请求: 步骤: get请求: // 1.创建一个XMLHttpRequest的对象. var xml=null; //初始值设为空 if(XMLHttpRequest){ xm ...

  6. 使用svn导入项目

    打开eclipse工作平台点击“File”-->import如下图:   在项目导入框中找到SVN选择“从SVN检出项目”然后点击“下一步”,出现如下界面:   在上图界面中选择“创建新的资源库 ...

  7. FireMonkey 源码学习(2)

    三.TControl FireMonkey重写了TControl的代码,实现了众多接口,如下图: 基类上实现了众多功能,这里不详细描述. 四.TEdit 编辑框是从TControl—TStyledCo ...

  8. POJ 1251 + HDU 1301 Jungle Roads 【最小生成树】

    题解 这是一道裸的最小生成树题,拿来练手,题目就不放了 个人理解  Prim有些类似最短路和贪心,不断找距当前点最小距离的点 Kruskal类似于并查集,不断找最小的边,如果不是一棵树的节点就合并为一 ...

  9. 因为强行关机, 而导致的fedora23 不能重新启动, 卡在开机logo那里的 修复 解决方案

    其实, fedora23的U盘live 也很好用, 很流畅, 主要还是 要用一个比较好的/快的 U盘. 这样live U盘在4GB(3.75GiB)的内存中还是较快的 原来的U盘live系统用得很卡, ...

  10. bzoj2152: 聪聪可可 点分治

    链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2152 luogu爆搜都能过,总时间超过100ms就是写错了 思路 直接mod上面跑点分治就行 ...