Java调用C程序 —— JNative

准备工作

JNative官方主页:http://jnative.free.fr/SPIP-v1-8-3/

JNative包下载:https://sourceforge.net/projects/jnative/

需要32位GCC + 32位JDK

注意事项:

  • 1.4RC3版本的JNative.jar中的lib-bin中自带了JNativeCpp.dll, 所以不需要再为JNative.jar配置JNativeCpp.dll
  • JNative只支持32位的JDK, 64位的系统需要安装32位的JDK来使用JNative, 否则会报错:
java.lang.IllegalStateException: JNative library not loaded, sorry !
  • 32程序Java程序调用64位gcc编译的dll动态库时,会显示找不到xxx.dll

 

一、编写C语言程序

mylib.h头文件(考虑了GCC和MS VC两种编译器)

#ifndef _MYLIB_H_
#define _MYLIB_H_

#ifdef _MSC_VER
	_declspec(dllexport) int add(int a, int b);
#endif

#ifdef __GNUC__
	int add(int a, int b);
#endif

#endif

test.c文件

#include <stdio.h>
#include "mylib.h"

int add(int a, int b){
	printf("dll function add() called\n");
	return (a + b);
}

 

二、编译成dll

这里使用MinGW来进行编译, 需要先安装MinGW

> gcc -Wall -shared mylib.c -o mylib.dll 

如果使用微软的编译器cl的话, 编译命令为

> cl mylib.c /link /out:mylib.dll /dll /OPT:NOWIN98 /machine:x86

这样就获得了mylib.dll文件

 

三、使用JNative调用dll

Main.java文件

import org.xvolks.jnative.JNative;
import org.xvolks.jnative.Type;
import org.xvolks.jnative.exceptions.NativeException;

// 使用32位jdk
public class Main {

    public static int nativeAdd(int a, int b) throws NativeException, IllegalAccessException {
        JNative jNative = null;
        jNative = new JNative("mylib.dll", "add");
        jNative.setRetVal(Type.INT);
        jNative.setParameter(0, a);
        jNative.setParameter(1, b);
        jNative.invoke();
        System.out.println("返回:" + jNative.getRetVal());
        return Integer.parseInt(jNative.getRetVal());
    }

    public static void main(String[] args) {
        try {
            // 调用
            nativeAdd(1, 2);
        } catch (NativeException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

执行命令:

> javac -cp JNative.jar Main.java
> java -classpath JNative.jar; Main

dll function add() called
返回:3

 

附录

mingw32下载:https://sourceforge.net/projects/mingw-w64/files/mingw-w64/

选择离线包i686-win32-sjlj

(注:下载完mingw32之后直接编译可能提示liblto_plugin-0.dll not found,所以需要下载liblto_plugin-0.dll放在安装磁盘点的对应目录下,比如我的是 D:\mingw32\libexec\gcc\i686-w64-mingw32\8.1.0 )

jdk8u202下载,官方归档:https://www.oracle.com/java/technologies/oracle-java-archive-downloads.html

(注:oracle官网下载的jdk8u241我这安装不上,下载完点击下一步直接没反应了,不知道是不是和jdK收费有关系,目前没解决方法)

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值