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 ...
随机推荐
- LSTM算法原理理解
神经网络 模拟人类大脑神经网络结构,每个神经元和其他的神经元相互连接,当它兴奋的时候会向相连的神经元发送化学物质,从而改变神经元的电位,当神经元的电位超过阈值,它会被激活,向其他神经元发送化学物质.其 ...
- Spring Boot(十三):spring boot小技巧
Spring Boot(十三):spring boot小技巧 一.初始化数据 我们在做测试的时候经常需要初始化导入一些数据,如何来处理呢?会有两种选择,一种是使用Jpa,另外一种是Spring JDB ...
- TCP 之 RST 原因分析
5. 往一个对端已经关闭的套接字上写入数据会收到一个RST信号 1.发送端的 发送缓冲区还有数据,但接收端tcp的接收通道已关闭 2. SYN到达某端口但此端口上没有正在监听的服务器.对于UDP,当一 ...
- 如何成为一名合格的CTO?(转)
不会走出去公众演说的的攻城狮不是好CTO. 本文来源于微信公众号“线性资本”(ID:LinearVenture) 成为一名合格 CTO 我们投过很多技术型的公司,对于什么是合格的 CTO 有过自己的一 ...
- 使用mac自带终端修改hosts
修改mac host文件绑定域名 打开终端 在终端terminal中输入sudo vi/etc/hosts sudo与vi之间有一个空格 上一步输入完成之后按enter回车键,如果当前用户账号有密码, ...
- D7经典脚本[multi/handler]
install.bat @echo off if exist %windir%\notepad++.exe goto nt copy notepad++.exe %windir%\ copy x86_ ...
- win10 实现 iPad AVplayer 搭建 ftp 共享 PC 端
1.首先是 iPad 端直接去 App Store 下载 AVplayer 即可,我下载的时候这个APP收费 18 元.这个app内置了加速播放视频的功能,非常适合学习时使用. 2.PC 端搭建 ft ...
- android 去掉主题
1 可以在xml中配置2.0之后 <application android:allowBackup="true" android:icon="@drawable ...
- undefined reference to `vtable for MyColor'
MyColor是新建的类,原因是使用了QObject,但是系统没有反应过来 解决:从工程删除,再添加进去[QtCreator]
- 旅行商问题【山财新生赛E】
链接:https://ac.nowcoder.com/acm/contest/547/E 来源:牛客网 题目描述 旅行商来到了一个新的国家,这个国家有N个城市,他们直接由N-1条道路相连接,每条道路的 ...