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