访问JNI对象到Java层作为引用指针

Access JNI Object to Java layer as reference pointer

本文关键字:引用 指针 Java JNI 对象 访问      更新时间:2023-10-16

我正在编写一个应用程序,其中我与JNI调用有很多关系,每次我都必须执行getter()调用来访问变量值。相反,可以访问对象引用JNI对象在Java层,所以可以得到更新的变量值只是通过变量名称(如obj.name而不是obj.getName())。

我已经检查了这个和这个,但不知道如何在java层将地址转换为对象。

编辑我想用这种方式从JNI在Java层访问Obj。

private native CustomObj getCPPCustomObjectPointer();

有什么建议吗

是否有可能在Java层上访问JNI对象的对象引用?

是的,你可以。但是你不能用它来访问它的属性。您只能将其地址保存为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

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

那些表示和访问对象/原语的实现(C/Java)是完全不同的。这就是为什么当你从一种数据类型转换到另一种数据类型时,会有那么多乱七八糟的函数。