В одном из моих Java-проектов я должен вызывать функцию C. Поскольку я новичок в JNI, я сначала попробовал простую программу Helloworld.
Я написал класс со ссылкой на собственный метод по имени sayHello()
, который возвращает void
и не принимает аргументов. Я скомпилировал класс и сгенерировал файл заголовка с помощью утилиты javah
. Затем я скопировал подпись этой функции в новый C-файл как новую функцию и просто вызвал printf("Hello, World!")
в этой функции. Я сгенерировал dll, используя gcc
на моей оболочке cygwin. Я проверил, что DLL содержит функцию. Я зарегистрировал dll с помощью утилиты regsvr32
.
Когда я запустил 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;
}