英文:
how to reuse objects between a java/rust service via JNI using raw pointer
问题
在每次从 Java 服务到 Rust 服务的调用中,我打算通过 JNI 传递单例(指针),然后在 Rust 中使用原始指针获取对象的引用并执行业务逻辑。
指针是否保证始终指向正确的对象?还是我需要将其固定,以确保它不会移动?
英文:
I've the following scenario. I've a java service that talks to a rust service via JNI.
I'm planning to re-use an object across multiple jni calls. So, I'm planning to create it in the first JNI call on the heap using a Box and return a raw pointer to the same. I intent to store it as a singleton in the java service.
In each call from java service to rust service , I intent to pass along the singleton(pointer) via JNI, and get a reference to the object using the raw pointer in rust and perform business logic.
Is it guranteed that the pointer will always point to the correct object? or do I need to pin it so that it doesn't move?
答案1
得分: 1
你不需要将它固定。
Pin
不是语言保证;它是一个库的保证。它阻止Rust代码移动该值。如果你不在Rust中移动该值,它将不会被移动。它将静默地保持在原地,你可以放心依赖于它。
英文:
You do not need to pin it.
Pin
is not a language guarantee; it is a library guarantee. It prevents Rust code from moving the value. If you will not move the value in Rust, it will not be moved. It will stay where it is silently and you can definitely rely on that.
答案2
得分: 1
由于您费了很大的劲将您的装箱对象的地址伪装成一个简单的数字,JVM 不会对其做任何特殊处理。
由您来确保该地址保持有效,这在这种情况下主要意味着不要让 Box 被丢弃。根据我所了解的 Rust,这意味着要么调用 Box::into_raw
要么调用 Box::leak
。
英文:
Since you took great pains in disguising the address of your boxed object as a simple number, the JVM will not do anything special with that.
It is up to you to ensure that that address remains valid, which in this case mostly means not letting the Box be dropped. From what little I know of Rust, that means either calling Box::into_raw
or Box::leak
.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论