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
分类:
android提高篇
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
2017-03-27 Android实践 -- 对apk进行系统签名
2017-03-27 Android实践 -- 设置系统日期时间和时区
2017-03-27 Android实践 -- 监听应用程序的安装、卸载
2017-03-27 Android 自定义Toast
2017-03-27 Android Material风格的应用(五)--CollapsingToolbar
2017-03-27 Android Material风格的应用(四)--FloatActionButton
2017-03-27 Android Material风格的应用(二)--RecyclerView