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

4
我正在编写一个应用程序,其中需要频繁使用JNI调用,并且每次都必须执行getter()调用来访问变量值。是否可以在Java层上访问JNI对象的对象引用,以便只需变量名(例如obj.name而不是obj.getName())即可获取更新后的变量值?
我已经查看了thisthis,但是没有找到如何将地址转换为Java层的对象的方法。 编辑 我想以这种方式从JNI在Java层上访问Obj。
private native CustomObj getCPPCustomObjectPointer();

任何建议在此。

1
你应该能够创建一个带有native方法的Java类,以便进行JNI访问。为什么不把你现在拥有的代码发布出来,这样社区就可以查看并找出最佳的前进方式了呢? - kris larson
Kris,我不知道如何将对象从JNI传递到Java,这就是我卡住的地方。我已经更新了我在JNI层期望的内容,请按照更新后的要求进行操作。 - CoDe
@Shubh 像这样吗?http://journals.ecs.soton.ac.uk/java/tutorial/native1.1/implementing/field.html - Andrew Henle
@EJP,除了JNI之外,还有什么选项可以像JNI一样快速,因为我每秒钟都要处理很多JNI层的工作。 - CoDe
@AndrewHenle 谢谢,现在我明白了你的意思。我遇到了 JNI DETECTED ERROR IN APPLICATION: field operation on invalid global reference: 0xa 的问题..你有没有遇到过类似的问题? - CoDe
显示剩余8条评论
2个回答

1

是否可以在Java层访问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

谢谢。关于将地址保存为长整型,我知道,但如果无法访问属性,则没有用处。我们能否通过JNI-> Java -> JNI(访问属性)来提供一些伪代码以访问属性? - CoDe
我不太明白你所说的“JNI-> Java -> JNI(访问属性)”是什么意思。如果你想要访问一个C++对象的属性/字段(其地址已知为Java端的long类型数字),据我所知,你无法在Java端实现这一点,但可以在C++端实现。 - frogatto
我的意思是从JNI获取地址到JAVA,然后再从Java获取相同的地址到JNI以读取对象属性作为指针引用。我卡在了如何通过JNI层的“long”地址创建对象上。 - CoDe
@Shubh 只需进行强制类型转换即可。MyClass *obj = (MyClass *)thatLongNumber; - frogatto

0

你想在Java端保留对C++对象的引用吗?很遗憾,你做不到。

C和Java的实现方式完全不同,因此在将一个数据类型转换为另一个数据类型时会出现很多混乱的函数


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接