gpt4 book ai didi

java - JNI : Is GetIntArrayElements always linear in time?

转载 作者:太空宇宙 更新时间:2023-11-04 03:22:56 24 4
gpt4 key购买 nike

因为我想知道是否值得使用JNI 来提高我的应用程序的性能,所以我想知道GetIntArrayElements 的复杂度是多少。它是否总是在 C 中分配一个新的原始数组并从原始 Java 数组中复制所有元素,或者它以某种方式设法传递一个指针?

我想知道是否值得将 JNI 用于线性算法,例如两个 vector 的逐点乘法。如果 GetIntArrayElements 是线性的,我想如果我们需要先复制 vector ,那么使用 C/C++ 的潜在性能提升将会丢失。

最佳答案

GetIntArrayElements有一个名为 isCopy 的可选引用参数。当 VM 复制数据供您使用时,此参数将设置为 JNI_TRUE。这个想法是不同的 VM 实现可能有不同的数组内存表示,也可能与 C 期望的内存布局不兼容。

通常在 Java 和 native 代码之间共享内存的最快方法是使用直接 ByteBuffer s(使用 allocateDirect 创建的)。这些缓冲区使用可直接从 C/C++ 使用的底层内存块。

在 Java 中,您创建一个缓冲区并用一些数据填充它:

public static void main(String[] args) {
byte[] ba = "Hello Wolrd!".getBytes(StandardCharsets.US_ASCII);
ByteBuffer bb = ByteBuffer.allocateDirect(ba.length + 1); // for terminator
bb.put(ba);
callCPP(bb);
}

private static native void callCPP(ByteBuffer bytes);

然后从 C/C++ 中,您可以使用 GetDirectBufferAddress 获取底层字节 block 的地址。 (这是在 C++ 中):

JNIEXPORT void JNICALL Java_Main_callCPP(JNIEnv *env, jclass, jobject buff) {
const char* str = (char*) env->GetDirectBufferAddress(buff);
printf(str); // Hello World!
}

使用 ByteBuffer 的缺点是没有数据抽象,就像类的字段有特定类型,字节缓冲区中的位置没有。

关于java - JNI : Is GetIntArrayElements always linear in time?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43763129/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com