有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JNI:动态链接库(DLL)初始化例程失败

正如标题中所说,我在将DLL文件链接到java时遇到问题。当代码是C语言时,它就工作了。我正在使用this指南来学习JNI和TDM-GCC compiler。当使用gcc(gcc -I"C:\Program Files\Java\jdk-11.0.10\include" -I"C:\Program Files\Java\jdk-11.0.10\include\win32" -shared -o hello.dll HelloJNI.c)编译时,java可以调用hello。没有问题的dll并运行它。但是当我尝试C++时(用{{CD2}}编译)它说初始化例程失败了。下面是我试图运行java -Djava.library.path=. HelloJNI时的消息:

Exception in thread "main" java.lang.UnsatisfiedLinkError: D:\Dev stuff\JNI\hello.dll: A dynamic link library (DLL) initialization routine failed
        at java.base/java.lang.ClassLoader$NativeLibrary.load0(Native Method)
        at java.base/java.lang.ClassLoader$NativeLibrary.load(ClassLoader.java:2430)
        at java.base/java.lang.ClassLoader$NativeLibrary.loadLibrary(ClassLoader.java:2487)
        at java.base/java.lang.ClassLoader.loadLibrary0(ClassLoader.java:2684)
        at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2649)
        at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:827)
        at java.base/java.lang.System.loadLibrary(System.java:1871)
        at HelloJNI.<clinit>(HelloJNI.java:4)

{}中的Java代码:

public class HelloJNI {
    static {
        System.loadLibrary("hello");
    }

    private native void sayHello();

    public static void main(String[] args) {
        new HelloJNI().sayHello();
    }
}

生成的头文件(HelloJNI.h):

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloJNI */

#ifndef _Included_HelloJNI
#define _Included_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloJNI
 * Method:    sayHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloJNI_sayHello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif
<^ > C++代码在^ {CD6>}:

#include <jni.h>       // JNI header provided by JDK
#include <iostream>    // C++ standard IO header
#include "HelloJNI.h"  // Generated
using namespace std;

// Implementation of the native method sayHello()
JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject thisObj) {
    cout << "Hello World from C++!" << endl;
   return;
}

我只是复制/粘贴了指南中的代码,没有发现代码有任何问题。奇怪的是C++代码在今天之前工作得很好。我想通过从本机访问Java对象来添加更多功能,但它不会突然加载。所以我又试着从头开始,但用一个简单的hello world示例都不行。我错过了什么?编译器有问题吗?或者我应该为g++编译器添加其他选项吗


共 (0) 个答案