在Java上加载dll库

发布于 2024-12-15 14:20:18 字数 208 浏览 1 评论 0原文

我需要在java上加载一个用C编写的库。我只有dll和头文件。 由于我不明白如何从 JNI 文档中翻译指针或其他派生类型,因此我尝试使用自动化工具,gluegen 和 SWIG,但我无法管理如何使用它们。

我尝试为 SWIG 创建一个接口文件,但它只给出错误。是否有关于如何使用任何可以工作并可以从 .h 文件生成翻译的 C 函数和类型的工具将 dll 加载到 java 程序的示例?

I need to load a library written in C on java. I have only dlls and header files.
Since I didn't understand how to translate pointers or other derivated types from JNI documentation I tried to use an automating tool for this, gluegen and SWIG, but I couldn't manage on how to use them.

I tried to create an interface file for SWIG but it only gives errors. Is there an example on how to load a dll to a java program using ANY tool that works and can generate translated C function and types from .h files ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

请爱~陌生人 2024-12-22 14:20:18

以下是如何在 Java 中执行 CRC32 的 JNI 示例:

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 创建头文件
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;
}

希望有所帮助。

Here is a JNI example of how to do CRC32 in 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
    }
}

Use javah -jni <Classname> to create a header file
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:
This file shows examples of JNI usage:

/* 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;
}

Hope that helps.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文