2011-11-14 2 views
1

J'ai besoin de charger une bibliothèque écrite en C sur Java. Je n'ai que des DLL et des fichiers d'en-tête. Comme je ne comprenais pas comment traduire des pointeurs ou d'autres types dérivés de la documentation JNI, j'ai essayé d'utiliser un outil d'automatisation pour cela, gluegen et SWIG, mais je n'ai pas réussi à les utiliser.Charger une bibliothèque DLL sur Java

J'ai essayé de créer un fichier d'interface pour SWIG mais cela ne donne que des erreurs. Existe-t-il un exemple sur la façon de charger une DLL dans un programme Java en utilisant n'importe quel outil qui fonctionne et qui peut générer des fonctions C traduites et des types à partir de fichiers .h?

Répondre

2

Voici un exemple JNI de comment faire CRC32 en 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 
    } 
} 

Utilisez javah -jni <Classname> pour créer un fichier d'en-tête 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: Ce fichier montre des exemples d'utilisation de 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; 
} 

Espérons que ça aide.

+0

Je ne vois pas où j'ai omis des détails importants ou fait des erreurs. Les codes Java et C ne semblent pas modifiés. – moshbear

+0

J'ai enfermé le javah -jni avec des accolades, ce qui a résolu le problème de l'équerre gauche sans obstruction de façon plus élégante. Et j'ai tendance à oublier que SO a besoin d'un double-ligne double pour que le code de bloc ou la mise en forme de la liste fonctionne correctement. – moshbear

Questions connexes