JNI何时可能需要复制基元类型的数组? 我主要是C++程序员,但我正在考虑使用java作为一个项目。出于性能原因,我需要使用一些SSE内部函数(这些函数可以极大地提高速度,即使是相对于普通C++)

JNI何时可能需要复制基元类型的数组? 我主要是C++程序员,但我正在考虑使用java作为一个项目。出于性能原因,我需要使用一些SSE内部函数(这些函数可以极大地提高速度,即使是相对于普通C++),java,performance,java-native-interface,sse,simd,Java,Performance,Java Native Interface,Sse,Simd,据我所知,在Java中实现这一点的方法是使用JNI并在C中调用SSE intrinsic。然而,我在JNI文档中读到的内容让我有点不安,因为它说JVM可能会也可能不会创建发送到C并返回的数组的副本 假设是最先进的实现,比如OpenJDK 7,当我请求将指针复制到字节[]、短[]、int[]或float[]时,我应该在什么时候期望复制 到目前为止,我所发现的只是一些相互矛盾的说法。要被接受,答案必须说服我:例如,提供证据或引用来源,而不仅仅是表达观点/猜测 编辑 链接到 正如我所提到的,在回答我的

据我所知,在Java中实现这一点的方法是使用JNI并在C中调用SSE intrinsic。然而,我在JNI文档中读到的内容让我有点不安,因为它说JVM可能会也可能不会创建发送到C并返回的数组的副本

假设是最先进的实现,比如OpenJDK 7,当我请求将指针复制到字节[]、短[]、int[]或float[]时,我应该在什么时候期望复制

到目前为止,我所发现的只是一些相互矛盾的说法。要被接受,答案必须说服我:例如,提供证据或引用来源,而不仅仅是表达观点/猜测

编辑

  • 链接到
  • 正如我所提到的,在回答我的问题时,假设OpenJDK 7是可以的
  • 到目前为止,我所发现的只是一些相互矛盾的说法

    不,这些说法并不矛盾,因为所说的是您所要求的是一个实现细节,取决于您将使用的JDK实现。
    您不应该期望所有实现都有相同的行为,您应该查看哪一个实现符合您的要求。
    为了给您一个实现差异的示例,
    SUN
    JDK将
    char[]
    传递给
    C
    code null终止,而IBM没有。
    因此,您应该深入研究实现和测试。至于你的问题,我不知道为什么阵列拷贝不会发生,因为我相信内存区域完全发生了变化

    到目前为止,我所发现的只是一些相互矛盾的说法

    不,这些说法并不矛盾,因为所说的是您所要求的是一个实现细节,取决于您将使用的JDK实现。
    您不应该期望所有实现都有相同的行为,您应该查看哪一个实现符合您的要求。
    为了给您一个实现差异的示例,
    SUN
    JDK将
    char[]
    传递给
    C
    code null终止,而IBM没有。

    因此,您应该深入研究实现和测试。至于你的问题,我不知道为什么数组复制不会发生,因为我相信内存区域的变化完全是

    < p>我会考虑使用直接ByteBuffer与本机字节排序。这样做的好处是它使用C空间内存,这意味着不需要复制它来访问java(反之亦然)

    < P>我会考虑使用直接ByteBuffer与本机字节排序。这样做的好处是它使用了C空间内存,这意味着在Java中访问它不需要复制它(反之亦然)

    JNI在设计上不提供对Java阵列原始数据的访问。上次我检查时,有单元素访问,并将一个区域从Java数组复制到非托管内存区域。我不明白为什么不能复制。@SevaAlekseyev这不是真的:请参阅例如GetPrimitiveArrayCriticalHm,我想我有一个旧的JNI引用。JNI设计上不提供对Java数组原始数据的访问。上次我检查时,有单元素访问,并将一个区域从Java数组复制到非托管内存区域。我不明白怎么会没有复制。@SevaAlekseyev这不是真的:例如,请参阅GetPrimitiveArrayCriticalHm,我想我有一个旧的JNI引用。“SUN JDK将char[]传递给以null结尾的C代码”很难让人相信。它为什么会这样做?@EJP:我不知道。当我们从SUN转到IBM时,我们遇到了这个问题,不得不更改它的C代码this@EJP:我必须为从java传递的所有字符串添加“\0”。我不需要使用SUN.mazing这样做
    GetStringUTFChars()?
    它没有文档记录,所以您不应该依赖它。不知道我的代码是否会:——|“SUN JDK将char[]传递给以null结尾的C代码”很难让人相信。它为什么会这样做?@EJP:我不知道。当我们从SUN转到IBM时,我们遇到了这个问题,不得不更改它的C代码this@EJP:我必须为从java传递的所有字符串添加“\0”。我不需要使用SUN.mazing这样做
    GetStringUTFChars()?
    它没有文档记录,所以您不应该依赖它。不知道我的代码是否:-|