Java JNI程序挂起

Java JNI程序挂起,java,java-native-interface,Java,Java Native Interface,在我的一个Java项目中,我需要调用一个C函数。由于我是JNI新手,我首先尝试了一个简单的Helloworld程序 我编写了一个类,其中引用了一个名为sayHello()的本机方法,该方法返回void,不带任何参数。我编译了这个类,并使用javah实用程序生成了头文件。然后,我将该函数的签名复制到一个新的C文件中作为一个新函数,并在该函数中调用printf(“Hello,World!”)。我在cygwin shell上使用gcc生成了一个dll。我验证了dll是否包含该函数。我使用regsvr3

在我的一个Java项目中,我需要调用一个C函数。由于我是JNI新手,我首先尝试了一个简单的Helloworld程序

我编写了一个类,其中引用了一个名为
sayHello()
的本机方法,该方法返回
void
,不带任何参数。我编译了这个类,并使用
javah
实用程序生成了头文件。然后,我将该函数的签名复制到一个新的C文件中作为一个新函数,并在该函数中调用
printf(“Hello,World!”)
。我在cygwin shell上使用
gcc
生成了一个dll。我验证了dll是否包含该函数。我使用
regsvr32
实用程序注册了dll

当我运行java程序调用
sayHello()
函数时,dll正在加载,我通过尝试在该程序仍在运行时删除dll进行了验证,但没有响应,应用程序似乎在等待什么

这有什么问题吗

源代码如下:

/* Hello.java */
public class Hello
{
    static
    {
        System.loadLibrary("hello");
    }

    public native void sayHello();

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

/*Hello.h*/
/*不要编辑此文件-它是机器生成的*/
#包括
/*类的标题Hello*/
#如果包括(你好)
#定义\u包含\u你好
#ifdef_uucplusplus
外部“C”{
#恩迪夫
/*
*班级:你好
*方法:你好
*签字:()五
*/
JNIEXPORT void JNICALL Java\u Hello\u sayHello
(JNIEnv*,jobject);
#ifdef_uucplusplus
}
#恩迪夫
#恩迪夫

/*Hello.c*/
#包括
#包括
#包括“Hello.h”
JNIEXPORT void JNICALL Java\u Hello\u sayHello
(JNIEnv*env,jobject对象)
{
printf(“你好,世界!”);
返回;
}


代码看起来很好(非常类似于)。能否请您添加一些有关编译DLL的详细信息,并在Java和C代码中添加一些跟踪?请尝试使用mingw编译。另外,您不需要注册dll。谢谢Piligrim。它是这样工作的。你能总结一下答案,如果你找到了一个解决方案,请把它标记为正确的吗?我也希望看到一个被接受的答案。你能记住解决方案@Shyam吗?代码看起来很好(非常类似于)。能否请您添加一些有关编译DLL的详细信息,并在Java和C代码中添加一些跟踪?请尝试使用mingw编译。另外,您不需要注册dll。谢谢Piligrim。它是这样工作的。你能总结一下答案,如果你找到了一个解决方案,请把它标记为正确的吗?我也希望看到一个被接受的答案。你能记住答案吗,@Shyam?
/* Hello.h */
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Hello */

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

#ifdef __cplusplus
}
#endif
#endif
/* Hello.c */
#include <stdio.h>
#include <jni.h>

#include "Hello.h"

JNIEXPORT void JNICALL Java_Hello_sayHello
  (JNIEnv *env, jobject obj)
{
    printf("Hello, World!");
    return;
}