Загрузите библиотеку dll на Java - PullRequest
1 голос
/ 14 ноября 2011

Мне нужно загрузить библиотеку, написанную на C, на Java.У меня есть только dll и заголовочные файлы.Так как я не понимал, как переводить указатели или другие производные типы из документации JNI, я пытался использовать для этого инструмент автоматизации, gluegen и SWIG, но я не мог понять, как их использовать.

Iпопытался создать файл интерфейса для SWIG, но он только дает ошибки.Есть ли пример того, как загрузить dll в java-программу, используя ЛЮБОЙ инструмент, который работает и может генерировать переведенные функции и типы C из файлов .h?

1 Ответ

2 голосов
/ 14 ноября 2011

Вот пример JNI, как сделать CRC32 в Java:

CRC32.java:

public class CRC32 {
    // JNI function must be declared native
    public static native int crc32(int crc, final byte[] buf);
    /* 
    public static void main(String[] argv) {}
    */
    static {
        System.loadLibrary("crc32"); // Load your dll with System.loadLibrary
    }
}

Использование javah -jni <Classname> для создания файла заголовка CRC32.h:

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

#ifndef _Included_CRC32
#define _Included_CRC32
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     CRC32
 * Method:    crc32
 * Signature: (I[B)I
 */
JNIEXPORT jint JNICALL Java_CRC32_crc32
  (JNIEnv *, jclass, jint, jbyteArray);

#ifdef __cplusplus
}
#endif
#endif

CRC32.c: В этом файле приведены примеры использования JNI:

/* For a look at the actual CRC32 algorithm, look at zlib's crc32.c */

#include <jni.h>
#include <stddef.h>
#ifdef _MSC_VER
 typedef unsigned __int8 uint8_t;
 typedef unsigned __int32 uint32_t;
#else
# include <stdint.h>
#endif

#include "CRC32.h"

uint32_t crc32(uint32_t crc, const void *const buf, size_t len);


uint32_t crc32(uint32_t crc, const void *const buf, size_t len) {
    (void)crc;
    (void)buf;
    (void)len;
    return 0;
}

JNIEXPORT jint JNICALL Java_CRC32_crc32(JNIEnv *jenv, jclass jcls,
         jint jcrc, jbyteArray jbuf)
{
 size_t len;
 uint32_t crc;
 jint scrc;
 const void *buf;
 jthrowable exc;
 len = (*env)->GetArrayLength(env, jbuf);
 crc = *((uint32_t *)&jcrc);
 buf = (*env)->GetPrimitiveArrayCritical(env, jbuf, 0);
 crc = crc32(crc, buf, len);
 (*env)->ReleasePrimitiveArrayCritical(env, jbuf, buf, 0);
 *((uint32_t *)&scrc) = crc;
 return scrc;
}

Надеюсь, это поможет.

...