簡體   English   中英

Java JNI C程序可以與Mingw32一起正常運行,而不能與Cygwin64一起運行

[英]Java JNI C Program Works fine with Mingw32 and not with Cygwin64

下面給出的Java JNI程序在環境下可以正常使用(1)。 但是,如果我將環境更改為(2),則會出錯。 感謝您提供幫助以解決此錯誤。

Java代碼:

package avajjni;
public class AvajJNI {
    static{
    //Environment (1)
    //System.load("D:\\cpro\\c_jni_library\\dist\\Debug\\MinGW_32-Windows\\libc_jni_library.dll");

    //Environment (2)
    System.load("D:/cpro/c_jni_library/dist/Debug/Cygwin_64-Windows/libc_jni_library.dll");
    }
    public native void fnDisplayData();
    public static void main(String[] args) {
        AvajJNI obj = new AvajJNI();
        obj.fnDisplayData();
    }
}

C代碼(.c)

#include <stdio.h>
#include "avajjni_AvajJNI.h"

JNIEXPORT void JNICALL Java_avajjni_AvajJNI_fnDisplayData
  (JNIEnv *env, jobject obj){
    printf("JNI Method Called\n");
}

工作環境良好的環境(1):
操作系統:Windows 8.1 64 bit
Java jdk1.8.0_51(32位)
Mingw 32位
C編譯器選項:-shared -m32 -Wl,-add-stdcall-alias
Netbeans使用32位Java運行

產生錯誤的環境(2):
操作系統:Windows 8.1 64 bit
Java jdk1.8.0_51(64位)
Cygwin 64位
沒有編譯器選項
將“ C:\\ cygwin64 \\ bin”添加到路徑環境變量
Netbeans使用64位Java運行

錯誤:

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0000000180126947, pid=7528, tid=20276
#
# JRE version: Java(TM) SE Runtime Environment (8.0_51-b16) (build 1.8.0_51-b16)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.51-b03 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# C  [cygwin1.dll+0xe6947]
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows

請讓我知道是否需要其他信息

我重現該問題,然后說明如何解決該問題:

mdorey@VXD0141 ~/tmp
$ cat avajjni/AvajJNI.java
package avajjni;
public class AvajJNI {
    static{
    //Environment (1)
    //System.load("D:\\cpro\\c_jni_library\\dist\\Debug\\MinGW_32-Windows\\libc_jni_library.dll");

    //Environment (2)
    System.load("C:\\cygwin64\\home\\mdorey\\tmp\\libc_jni_library.dll");
    }
    public native void fnDisplayData();
    public static void main(String[] args) {
        AvajJNI obj = new AvajJNI();
        obj.fnDisplayData();
    }
}

mdorey@VXD0141 ~/tmp
$ cat AvajJNI.c 
#include "stdio.h"

typedef unsigned long long __int64;
#include "avajjni_AvajJNI.h"

JNIEXPORT void JNICALL Java_avajjni_AvajJNI_fnDisplayData
  (JNIEnv *env, jobject obj){
    printf("JNI Method Called\n");
}

mdorey@VXD0141 ~/tmp
$ javac avajjni/AvajJNI.java

mdorey@VXD0141 ~/tmp
$ javah avajjni.AvajJNI

mdorey@VXD0141 ~/tmp
$ gcc -I /cygdrive/c/Program\ Files/Java/jdk1.8.0_72/include -I /cygdrive/c/Pro
gram\ Files/Java/jdk1.8.0_72/include/win32 -o libc_jni_library.dll -shared Avaj
JNI.c 

mdorey@VXD0141 ~/tmp
$ java avajjni/AvajJNI
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0000000180185145, pid=8780, tid=7560
#
# JRE version: Java(TM) SE Runtime Environment (8.0_72-b15) (build 1.8.0_72-b15)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.72-b15 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# C  [cygwin1.dll+0x145145]
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# C:\cygwin64\home\mdorey\tmp\hs_err_pid8780.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.java.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#

mdorey@VXD0141 ~/tmp
$ /cygdrive/c/Program\ Files/software.jessies.org/terminator/Resources/salma-ha
yek/.generated/amd64_Cygwin/bin/java-launcher.exe avajjni/AvajJNI
JNI Method Called

mdorey@VXD0141 ~/tmp
$

https://stackoverflow.com/a/13640189/18096

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM