带有本机方法 malloc() 的 JNI 导致 Cygwin 崩溃
JNI with native method malloc() causing crash on Cygwin
我有一个用 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的本机内存?
JNI 声明必须完全 正确的参数,包括未使用的参数,并且函数声明必须包含来自 jni.h 的宏 JNIEXPORT 和 JNICALL .如果没有这些,函数可能不会 return 堆栈在退出时进入正确的状态,从而导致未定义的行为。
将函数声明更改为:
JNIEXPORT void JNICALL Java_main_Main_testMalloc(JNIEnv *env, jobject obj){
char *c = malloc(sizeof(char)*5);
}
然后看看你得到了什么。
我有一个用 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的本机内存?
JNI 声明必须完全 正确的参数,包括未使用的参数,并且函数声明必须包含来自 jni.h 的宏 JNIEXPORT 和 JNICALL .如果没有这些,函数可能不会 return 堆栈在退出时进入正确的状态,从而导致未定义的行为。
将函数声明更改为:
JNIEXPORT void JNICALL Java_main_Main_testMalloc(JNIEnv *env, jobject obj){
char *c = malloc(sizeof(char)*5);
}
然后看看你得到了什么。