2015-04-20 70 views
1

導致崩潰我在C自定義DLL與一個本地功能如此簡單:JNI與本地方法的malloc()在Cygwin

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

那不是'javah'生成的確切的方法調用嗎?你也應該有一個'jobject'通過。 –

+0

@AndrewHenle,根據JNI的說法,我必須默認JNIEnv和jobject。無論如何,問題仍然存在。我試圖用C++編譯器完全做同樣的事情,把malloc()換成新的char [5]。它有效,沒有問題。 – user2092119

+0

所以你沒有正確定義你的方法,你想知道爲什麼它不能正確工作? –

回答

1

JNI聲明必須有正確的正確的參數,包括未使用的參數,函數聲明必須包含來自jni.h的宏JNIEXPORT和JNICALL。沒有這些,有可能函數在退出時不會將堆棧返回到正確的狀態,導致未定義的行爲。

變化的函數聲明說:

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

,然後看看會發生什麼。

+0

同樣的效果。編輯OP包含一些細節。 – user2092119

+0

你可以調用C庫中的其他函數嗎? –

+0

嘗試了一些任意的:rand()工作,printf()不工作,strtod()工作不正常,sin()工作,calloc()不工作,fopen()不工作。 :( – user2092119