如何让JavaCritical真正在JNI上工作

时间:2018-02-11 09:36:41

标签: java java-native-interface

尝试实现其中描述的方法(请参阅注释): Is it possible to use sun.misc.Unsafe to call C functions without JNI?

但无法调用我的JavaCritical_方法。

这是JNI部分

JNIEXPORT void JNICALL JavaCritical_blas_BLAS_a(jint, jdouble *na) {
    printf("!v!\n");
}

JNIEXPORT void JNICALL Java_blas_BLAS_a(JNIEnv *env, jclass, jdoubleArray a) {
}

这是Java:

public class BLAS {
    public static native void a(double[] a);
}

如果我用-XX运行我的程序:+ TieredCompilation -XX:+ PrintCompilation,我得到这个

   3475 1488     n 0       blas.BLAS::a (native)   (static)

和"!v!"没有打印。据我了解," n"在输出中意味着JVM使用JNI的Java_xx方法的包装器,而不是CriticalJava方法。

所以有人可以建议我做错了什么? 顺便说一句,我在x64位Windows 10下的JVM v1.8.0_152 x86模式下运行它。

1 个答案:

答案 0 :(得分:1)

哎呀。没关系。 通过引入.def文件,我能够让它工作。

确实有一个错误: https://bugs.openjdk.java.net/browse/JDK-8167408 还在那里。

有趣的是:你需要将lib中的所有JNI方法移动到.def文件中,因为如果你混合了装饰和未修饰的名字,那么可能不会选择JavaCritical。

这个东西确实适用于复杂的签名方法,比如dgemm,这很酷。