JVM 在加载已编译的 DLL 时退出且没有任何错误消息
JVM exits without any error messages when loading compiled DLL
我正在尝试从 Java 调用 c 函数。
加载库时(在 Test.java 中)随机发生 2 件事:
- “Load Lib”被打印出来,jvm 没有任何错误就退出了
- “Load Lib”被打印出来,jvm 陷入循环
奇怪的是 'sometimes'“Lib loaded”也被打印出来了。这意味着库已加载...
我的问题是我该如何解决这个问题?真正的问题是我不知道自己做错了什么。
dll编译步骤:
- gcc -fpic -I "C:\Program Files\Java\jdk-15\include" -I "C:\Program Files\Java\jdk-15\include\win32" -c BindLib.c BindLib.h
- gcc -fpic -s -shared -o BindLib.dll BindLib.o
系统信息:
- Windows 10 64 位,版本 1909
- Java 15
主文件:
package degubi;
public final class Main {
public static void main(String[] args) {
Test.enable();
}
}
库文件:
package degubi;
public class Test {
static {
System.out.println("Load lib");
System.loadLibrary("BindLib");
System.out.println("Lib loaded");
}
public static native void enable();
}
源文件:
#include "windows.h"
#include "BindLib.h"
JNIEXPORT void JNICALL Java_degubi_Test_enable(JNIEnv* env, jclass clazz) {
}
头文件:
#define __int64 long long
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class degubi_Test */
#ifndef _Included_degubi_Test
#define _Included_degubi_Test
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: degubi_Test
* Method: enable
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_degubi_Test_enable(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
您使用的是哪个 shell 和 C 编译器?
问题可能来自 C 编译器与 shell 环境之间的不兼容。
例如,如果您使用 Cygwin 编译器编译 DLL,然后在 Windows CMD 上执行二进制文件,程序可能无法运行(依赖于 cygwin.dll)。
我最终在 Visual Studio 中创建了一个项目并从那里开始构建它……工作完美。仍然不知道是什么导致了这个问题。
我正在尝试从 Java 调用 c 函数。 加载库时(在 Test.java 中)随机发生 2 件事:
- “Load Lib”被打印出来,jvm 没有任何错误就退出了
- “Load Lib”被打印出来,jvm 陷入循环
奇怪的是 'sometimes'“Lib loaded”也被打印出来了。这意味着库已加载...
我的问题是我该如何解决这个问题?真正的问题是我不知道自己做错了什么。
dll编译步骤:
- gcc -fpic -I "C:\Program Files\Java\jdk-15\include" -I "C:\Program Files\Java\jdk-15\include\win32" -c BindLib.c BindLib.h
- gcc -fpic -s -shared -o BindLib.dll BindLib.o
系统信息:
- Windows 10 64 位,版本 1909
- Java 15
主文件:
package degubi;
public final class Main {
public static void main(String[] args) {
Test.enable();
}
}
库文件:
package degubi;
public class Test {
static {
System.out.println("Load lib");
System.loadLibrary("BindLib");
System.out.println("Lib loaded");
}
public static native void enable();
}
源文件:
#include "windows.h"
#include "BindLib.h"
JNIEXPORT void JNICALL Java_degubi_Test_enable(JNIEnv* env, jclass clazz) {
}
头文件:
#define __int64 long long
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class degubi_Test */
#ifndef _Included_degubi_Test
#define _Included_degubi_Test
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: degubi_Test
* Method: enable
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_degubi_Test_enable(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
您使用的是哪个 shell 和 C 编译器? 问题可能来自 C 编译器与 shell 环境之间的不兼容。
例如,如果您使用 Cygwin 编译器编译 DLL,然后在 Windows CMD 上执行二进制文件,程序可能无法运行(依赖于 cygwin.dll)。
我最终在 Visual Studio 中创建了一个项目并从那里开始构建它……工作完美。仍然不知道是什么导致了这个问题。