将JNI Object作为参考指针访问Java层

时间:2015-09-29 09:26:55

标签: java android c++ pointers java-native-interface

我正在编写一个与getter()调用有很多关系的应用程序,每次我必须执行JNI调用来访问变量值。相反,可以在Java Layer上访问obj.name对象的对象引用,因此可以仅通过变量名称获取更新的变量值(例如obj.getName()而不是private native CustomObj getCPPCustomObjectPointer(); )。

我已经检查了thisthis,但没有办法在java层上将地址转换为Object。

修改 我想在JNI的Java层以这种方式访问​​Obj。

temp

这里有任何建议。

2 个答案:

答案 0 :(得分:1)

  

是否可以在Java Layer上访问JNI对象的Object引用?

是的,你可以。但是,您无法使用它来访问其属性。您只能将其地址保留为long值。

如果您愿意,您应该在堆内存中创建C ++对象,并将其地址作为long个数字返回。

MyClass *obj = new MyClass();
return (long) obj;

在Java端,您可以将该地址另存为long个号码。由于已在堆内存中创建了对象,因此它们在JNI调用之间保持有效。

此外,您必须将它们作为long号码传递给以后的JNI调用,然后您应该将它们转换为C ++端的MyClass *

MyClass *obj = (MyClass *)thatLongNumber;
obj->someProperty; // Access its properties and methods via -> operator

答案 1 :(得分:0)

您想要从Java 端保留对 对象的引用吗? 你不能

用于表示和访问对象/原语的那些实现(C / Java)是完全不同的。 这就是为什么当你从一种数据类型转换到另一种数据类型时,有mambo jambo functions这么多的原因。