JNI程序挂起

时间:2009-09-17 10:47:10

标签: java java-native-interface

在我的一个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 */
/* 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;
}

0 个答案:

没有答案