gpt4 book ai didi

java - 是否可以在没有 JNI 的情况下使用 sun.misc.Unsafe 调用 C 函数?

转载 作者:IT老高 更新时间:2023-10-28 20:36:54 25 4
gpt4 key购买 nike

一段 C/C++ 代码可以提供一个带有函数指针数组的 JNI 方法。但是有没有办法直接从Java代码内部(不使用JNI或类似的)调用数组指针指向的函数堆栈? JNI 不知何故做了类似的事情,所以一定有办法。 JNI 是如何做到的?是通过 sun.misc.Unsafe 吗?即使不是,我们是否可以使用一些不安全的解决方法来获取执行此操作的 JVM 代码?

我当然不打算将其用于商业用途。我什至不是专业人士,我只是真的很喜欢编码,而且我最近一直在研究 CUDA,所以我想也许我可以尝试将所有东西混合在一起,但是 JNI 调用的开销会破坏使用 GPU 加速代码的目的。

最佳答案

JNI 有那么慢吗?

JNI 已经优化了很多,你应该先尝试一下。但它确实有一定的开销,see details .

如果 native 函数简单且被频繁调用,则此开销可能会很大。 JDK 有一个名为 Critical Natives 的私有(private) API,以减少调用不需要太多 JNI 功能的函数的开销。

关键原住民

原生方法必须满足以下条件才能成为关键原生:

  • 必须是静态不同步
  • 参数类型必须是primitiveprimitive arrays
  • 实现不能调用 JNI 函数,即不能分配 Java 对象或抛出异常;
  • 不应长时间运行,因为它在运行时会阻塞 GC

关键原生的声明看起来像一个常规的 JNI 方法,除了

  • 它以 JavaCritical_ 而不是 Java_ 开头;
  • 它没有额外的 JNIEnv*jclass 参数;
  • Java 数组在两个参数中传递:第一个是数组长度,第二个是指向原始数组数据的指针。也就是不需要调用GetArrayElements和 friend 们,直接使用数组指针即可。

例如一个 JNI 方法

JNIEXPORT jint JNICALL
Java_com_package_MyClass_nativeMethod(JNIEnv* env, jclass klass, jbyteArray array) {
jboolean isCopy;
jint length = (*env)->GetArrayLength(env, array);
jbyte* buf = (*env)->GetByteArrayElements(env, array, &isCopy);
jint result = process(buf, length);
(*env)->ReleaseByteArrayElements(env, array, buf, JNI_ABORT);
return result;
}

将转向

JNIEXPORT jint JNICALL
JavaCritical_com_package_MyClass_nativeMethod(jint length, jbyte* buf) {
return process(buf, length);
}

仅从 JDK 7 开始的 HotSpot JVM 支持关键 native 。此外,“关键”版本仅从编译代码中调用。因此,您需要关键实现和标准实现才能使其正常工作。

此功能专为 JDK 内部使用而设计。没有公共(public)规范或其他东西。您可能会找到的唯一文档是对 JDK-7013347 的评论。 .

基准测试

This benchmark显示当 native 工作负载非常小时,关键 native 可以比常规 JNI 方法快几倍。方法越长,相对开销越小。

Performance of JNI calls


P.S. JDK 中正在进行的工作是实现 Native MethodHandles,它将作为 JNI 的更快替代方案。但是它不太可能出现在 JDK 10 之前。

  1. http://cr.openjdk.java.net/~jrose/panama/native-call-primitive.html
  2. http://mail.openjdk.java.net/pipermail/panama-dev/2015-December/000225.html

关于java - 是否可以在没有 JNI 的情况下使用 sun.misc.Unsafe 调用 C 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36298111/

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