如何通过JNI将复杂对象传递到本地代码?

雪梦科技 2011-10-10 05:39:57
现在有一个android项目,上层已经是一个一个对象。我现在要做的就是把这些对象拆解,取出其中基本元素的值。
如下所示:
假如我现在将一个Class A的对象传到本地代码,我怎么能够获取到Rect的left/top/right/bottom值?

如果是Verctor<A B>这样更复杂的对象,我又怎么从中获取到Rect的left/top/right/bottom值?


java code:

class A{
Rect mrect;

}

谢谢~~
...全文
226 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
canglongyt 2011-10-11
  • 打赏
  • 举报
回复
Rect dirty 是C++的对象,dirtyRect的类型是jobject,是Java传过来的对象。
雪梦科技 2011-10-11
  • 打赏
  • 举报
回复
关键Rect dirty;还在传过来的对象里面呢?

[Quote=引用 3 楼 canglongyt 的回复:]

定义结构体:
struct ro_t {
jfieldID l;
jfieldID t;
jfieldID r;
jfieldID b;
};
static ro_t ro;
映射Java对象:
jclass rect = env->FindClass("android/graphics/Rect");
ro.l = env->GetF……
[/Quote]
canglongyt 2011-10-11
  • 打赏
  • 举报
回复
定义结构体:
struct ro_t {
jfieldID l;
jfieldID t;
jfieldID r;
jfieldID b;
};
static ro_t ro;
映射Java对象:
jclass rect = env->FindClass("android/graphics/Rect");
ro.l = env->GetFieldID(rect, "left", "I");
ro.t = env->GetFieldID(rect, "top", "I");
ro.r = env->GetFieldID(rect, "right", "I");
ro.b = env->GetFieldID(rect, "bottom", "I");
结构体赋值给C++对象成员:
Rect dirty;
dirty.left = env->GetIntField(dirtyRect, ro.l);
dirty.top = env->GetIntField(dirtyRect, ro.t);
dirty.right = env->GetIntField(dirtyRect, ro.r);
dirty.bottom= env->GetIntField(dirtyRect, ro.b);
反向设置Java对象成员:
const Rect& bounds(dirtyRegion.getBounds());
env->SetIntField(dirtyRect, ro.l, bounds.left);
env->SetIntField(dirtyRect, ro.t, bounds.top);
env->SetIntField(dirtyRect, ro.r, bounds.right);
env->SetIntField(dirtyRect, ro.b, bounds.bottom);
雪梦科技 2011-10-10
  • 打赏
  • 举报
回复
针对基本的类型,怎么操作我清楚/tg
我说的是这种从对象的对象里面取出基本类型的数据,谢谢。
aSysBang 2011-10-10
  • 打赏
  • 举报
回复
JNI里面处理 就用
jclass cls = env->GetObjectClass(obj);
然后 env->GetFieldID env->GetIntField
类似反射获得属性


JNI返回 就用
env->NewObject 或者 env->NewObjectA

80,350

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧