java - 加载已编译的 DLL 时 JVM 退出且没有任何错误消息
问题描述
我正在尝试从 Java 调用 ac 函数。加载库(在 Test.java 中)时,会随机发生 2 件事:
- “Load Lib”被打印出来,jvm直接退出而没有任何错误
- “Load Lib”被打印出来,jvm陷入循环
奇怪的是,“有时”“加载的库”也会被打印出来。这意味着库已加载...
我的问题是我该如何解决这个问题?真正的问题是我不知道自己做错了什么。
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
- 爪哇 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)。
推荐阅读
- node.js - 如何镜像视频并在节点js中添加wotermark
- html - 如何使用 CSS 制作 3D 框架
- flutter - Flutter - 具有图像和视频上传功能的富文本编辑器
- vuejs2 - Chart JS 将 Donut 从 0 刷新到 100,我希望它可以自行调整圆弧大小
- python - 计算数据框列中元素对的出现次数
- opencv - 如果调整大小为相同的形状,低分辨率和高分辨率图像是否具有相同的质量?
- python - 更改密码后保持用户登录(Django)自定义用户模型
- node.js - 一切正常,但突然出现mongo错误
- laravel - gmail中相同的发件人和收件人地址
- sql - 即使从表中归档历史数据,也保持列值的唯一性