JNI使用本机方法malloc()导致Cygwin崩溃

时间:2015-04-20 10:50:35

标签: java c java-native-interface cygwin malloc

我在C中有一个自定义DLL,其中一个本机函数就像这样简单:

void Java_main_Main_testMalloc(JNIEnv *env){
    char *c = malloc(sizeof(char)*5);
}

内部Java:

package main;

public class Main {

    public static void main(String[] args){

        System.loadLibrary("libJNI_test1");
        Main m = new Main();
    }

    public Main(){
        testMalloc();
    }

    native void testMalloc();
}


Main:
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000000018011ae47, pid=8604, tid=5464
#
# JRE version: Java(TM) SE Runtime Environment (8.0_05-b13) (build 1.8.0_05-b13)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.5-b02 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# C  [cygwin1.dll+0xdae47]

当然,这是剥离版本。但是我确定它因为我所做的所有测试而在malloc()上崩溃了。只需注释掉malloc,编译DLL就可以了。崩溃时发生致命错误:EXCEPTION_ACCESS_VIOLATION(0xc0000005)。有时它运行正常,有时它会挂在Java调用本机方法的地方......我做错了什么?我如何分配我将临时用作缓冲区或w / e的本机内存?

1 个答案:

答案 0 :(得分:1)

JNI声明必须完全正确的参数,包括未使用的参数,并且函数声明必须包含来自jni.h的宏JNIEXPORT和JNICALL。如果没有这些,则函数退出时可能不会将堆栈返回到正确的状态,从而导致未定义的行为。

将函数声明更改为:

 JNIEXPORT void JNICALL Java_main_Main_testMalloc(JNIEnv *env, jobject obj){
     char *c = malloc(sizeof(char)*5);
 }

然后看看你得到了什么。