尝试实现其中描述的方法(请参阅注释): 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模式下运行它。
答案 0 :(得分:1)
哎呀。没关系。 通过引入.def文件,我能够让它工作。
确实有一个错误: https://bugs.openjdk.java.net/browse/JDK-8167408 还在那里。 有趣的是:你需要将lib中的所有JNI方法移动到.def文件中,因为如果你混合了装饰和未修饰的名字,那么可能不会选择JavaCritical。这个东西确实适用于复杂的签名方法,比如dgemm,这很酷。