【问题标题】:JVM exits without any error messages when loading compiled DLL加载编译的 DLL 时 JVM 退出且没有任何错误消息
【发布时间】:2020-10-14 15:23:20
【问题描述】:

我正在尝试从 Java 调用 c 函数。 加载库时(在 Test.java 中)有 2 件事随机发生:

  • “Load Lib”被打印出来,jvm 直接退出,没有任何错误
  • “Load Lib”被打印,jvm 陷入循环

奇怪的是,“有时”“已加载 Lib”也会被打印出来。这意味着库已加载...

我的问题是我该如何解决这个问题?真正的问题是我不知道自己做错了什么。

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

【问题讨论】:

    标签: java c jvm java-native-interface


    【解决方案1】:

    您使用的是哪个 shell 和 C 编译器? 问题可能来自C编译器和shell环境不兼容。

    例如,如果您使用 Cygwin 编译器编译 DLL,然后在 Windows CMD 上执行二进制文件,则程序可能无法运行(依赖于 cygwin.dll)。

    【讨论】:

    • 我使用 Cygwin 进行编译。我尝试在 IDE 和 CMD 中运行它(使用 'mvn clean install' 创建的 jar,使用 java -jar 'jarName' 运行)每次都发生同样的事情
    • 抱歉延迟回复。如果你在 Cygwin 上编译原生库,那么最好在 Cygwin shell 上运行它。
    【解决方案2】:

    我最终在 Visual Studio 中创建了一个项目并从那里构建它...运行良好。仍然不知道是什么导致了问题。

    【讨论】:

      猜你喜欢
      • 2019-07-29
      • 1970-01-01
      • 1970-01-01
      • 2016-02-17
      • 1970-01-01
      相关资源
      最近更新 更多