Java: JNI返回Java对象(转)
例:
从Native层返回一个Java对象,有两种操作
1. 传入一个创建好的Java对象,只在JNI代码中做赋值操作并返回;
2. 完全在JNI代码中新建一个对象,赋值并返回;
创建一个Person类
public class Person { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
Native方法
//方法1 从Java层传入一个对象 public native Person getPerson(Person person); //方法2 完全从Native代码中创建对象 public native Person getPerson2();
C++代码
方法1:
extern "C" JNIEXPORT jobject JNICALL Java_com_myapplication_MainActivity_getPerson(JNIEnv *env, jobject instance, jobject person) { // 找到对象的Java类 jclass myClass = env->FindClass("com/myapplication/Person"); // 对应的Java属性 jfieldID name = env->GetFieldID(myClass, "name", "Ljava/lang/String;"); jfieldID age = env->GetFieldID(myClass, "age", "I"); //属性赋值,person为传入的Java对象 env->SetObjectField(person, name, env->NewStringUTF("liuwei")); env->SetIntField(person, age, 20); return person; }
方法2:
extern "C" JNIEXPORT jobject JNICALL Java_com_myapplication_MainActivity_getPerson2(JNIEnv *env, jobject instance) { jclass myClass = env->FindClass("com/myapplication/Person"); // 获取类的构造函数,记住这里是调用无参的构造函数 jmethodID id = env->GetMethodID(myClass, "<init>", "()V"); // 创建一个新的对象 jobject person_ = env->NewObject(myClass, id); jfieldID name = env->GetFieldID(myClass, "name", "Ljava/lang/String;"); jfieldID age = env->GetFieldID(myClass, "age", "I"); env->SetObjectField(person_, name, env->NewStringUTF("liuwei")); env->SetIntField(person_, age, 20); return person_; }
可以看到,方法1和方法2的代码区别就2行:
// 获取类的构造函数,记住这里是调用无参的构造函数 jmethodID id = env->GetMethodID(myClass, "<init>", "()V"); // 创建一个新的对象 jobject person_ = env->NewObject(myClass, id);
在开发时 env->GetMethodID(myClass, "<init>", "()V"); 很可能会在写代码是标红,提示无法找到 <init>, 不需要理会,直接编译就好了。
调用:
TextView tv = findViewById(R.id.sample_text); Person person = new Person(); //传入Java对象,返回的也是同一个对象 getPerson(person); tv.setText(person.getName() // 方法1 + " : " + getPerson2().getAge() // 方法2 );
本文转自:
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
2017-11-23 View坐标系详解(getTop(),getLeft(),getX(),getY(),getLocationOnScreen(), getLocationInWindow())
2016-11-23 新浪微博客户端(34)-block的细节与本质
2016-11-23 新浪微博客户端(33)-显示头像上的认证类型
2016-11-23 新浪微博客户端(32)-设置相册图片的contentMode
2016-11-23 新浪微博客户端(31)-显示相册图片上的GIF标记