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 ...
随机推荐
- WINDOW 安装ImageMagick服务端和PHP的imagick插件
写在最前: windows下要注意的就是ImageMagick版本要与php扩展的Imagick能对应上,同时Imagick版本的选择也要与服务器环境以及php的情况对应上,不然就容易安装失败,我就是 ...
- linux apidoc的安装和使用
1.先去官网下载已编译好的安装包 以Centos7.4 64位为例, 下载地址: https://nodejs.org/dist/v8.1.2/node-v8.1.2-linux-x64.tar.xz ...
- SVN更新无数次后仍显示Out of date
理器相集成的TortoiseSVN更是方便. 但有时候在提交修改后的文件时,却莫名其妙的出现out of date错误,导致工程无法commit,即使将新文件删了重新update,然后再在旧文件上作修 ...
- 01: flask基础
1.1 flask介绍 参考博客: https://www.cnblogs.com/sss4/p/8097653.html 1.django.tornado.flask比较 1. Django:1 ...
- 在eclipse中, 如何快速输入(快捷键)System.out.println();
1.快速输入(快捷键)System.out.println(); 首先输入sysout或syso,然后ALT+/ System.out.println(); 2.快速输入(快捷键)System.err ...
- error C4996: Function call with parameters that may be unsafe – this call relies on the caller to ch
在加入QCustomplot时有如题的错误 1>c:\program files (x86)\microsoft visual studio11.0\vc\include\xutility(21 ...
- EGIT
https://jingyan.baidu.com/article/64d05a0262f013de55f73bcc.html
- topcoder srm 430 div1
problem1 link 其实就是找到一个数字$t$,使得$x$的二进制为1 的位上$t$也都为1.然后$t$删掉所有那些$x$为1的二进制位就是$k$. problem2 link 设所有合法的边 ...
- Linux使用——Linux命令——Linux 系统基本命令使用记录
查看系统版本信息 查看系统版本:cat /proc/version 查看cpu相关信息,包括型号.主频.内核信息:cat /proc/cpuinfo 快速了解CPU使用情况:free -h 解压文件 ...
- Linux/shell: Concatenate multiple lines to one line
$ cat file START Unix Linux START Solaris Aix SCO 1. Join the lines following the pattern START with ...