首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Java/Scala中正确缓存Bridj JNI对象

如何在Java/Scala中正确缓存Bridj JNI对象
EN

Stack Overflow用户
提问于 2017-08-19 18:35:51
回答 1查看 140关注 0票数 2

我正在寻找一些关于在多个JNI调用之间缓存和重用Bridj JNI对象的指导原则。我发现缓存JNI对象极大地加快了通过JNI调用C函数的速度,但它也会导致一些数值稳定性问题。基本上,有时相同的C函数使用相同的参数会产生不同的结果。

我发现这个页面讨论了如何缓存JNI对象。http://www.latkin.org/blog/2016/02/01/jni-object-lifetimes-quick-reference/

有没有人用BridJ这样做,有没有关于如何缓存原语、结构、指针等的提示?

EN

回答 1

Stack Overflow用户

发布于 2017-08-22 21:40:19

一般来说,只需要知道java对所有Bridj指针的引用应该被保留,这样它们就不会被JVM垃圾收集器收集。一旦发生这种情况,Bridj/JNI将释放为这些指针分配的内存。

需要注意的一种特殊情况是:假设您创建了一个自动生成(使用JNAerator)类的实例:

代码语言:javascript
复制
@Library("libtarget.so")
public class SomeStruct extends StructObject {
  public SomeStruct() {
    super();
  }

  @Field(0)
  public Pointer<Byte > p0() {
    return this.io.getPointerField(this, 0);
  }

  @Field(0)
  public SomeStruct p0(Pointer<Byte > p0) {
    this.io.setPointerField(this, 0, p0);
    return this;
  }
...
}

然后

代码语言:javascript
复制
val struct = new SomeStruct()
struct.p0(pointerToCString("a"))

仅保留对结构对象的引用是不够的,还需要单独维护对pointerToCString("a")的引用。如果没有,一旦这个指针被垃圾收集器回收,Bridj/JNI将释放分配的内存。这在上面的代码中并不明显,因为它建议SomeStruct()对象无论如何都应该保留对pointerToCString("a")指针的引用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45770502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档