您好,欢迎访问沃航(武汉)科技有限公司官方网站
java的jni开发
2017-09-19 11:47:16

小沃今天个大家讲的课是java的jni开发,简单的说就是在java中调用C开发的dll,由于是dll,所以还需要用到我们之前讲到的mingw。好了,废话不多说,小沃现在就来给大家讲讲如何让java访问dll。

一、创建java工程,并且添加一个native函数申明。

如:

public static native int add(int a, int b);


二、使用javah命令生成*.h文件

然后使用javah这个命令生成一个*.h文件,具体方法为javah -jni [包名].类名

比如说如果您当前的包名为com.worldflying.nativeapp,类名为Nativefunc,

那么就是javah -jni com.worldflying.nativeapp.Nativefunc


三、根据*.h文件中的函数原型声明,创建c函数

这里需要注意,需要给变量参数添加参数名,比如:

JNIEXPORT jint JNICALL Java_Nativefunc(JNIEnv *, jclass, jint, jint);

这个是原型,实际写代码时需要用

JNIEXPORT jint JNICALL Java_Nativefunc(JNIEnv *p, jclass c, jint a, jint b);

然后再函数原型里面写函数体。


四、修改*.h以及添加需要的*.h文件

  1. 将生成的*.h中的#include <jni.h>修改为#include "jni.h"

  2. 将jdk安装目录中的include文件夹下的jni.h与include/win32文件夹下的jni_md.h放到与c文件同级目录下。

  3. 最后执行gcc --shared *.c -o *.dll


五、通过System.load导入dll,并且通过native函数直接调用它

好了,不多说了,直接上代码:

Main.java

package nativetest;

public class Main {

    public static void main(String[] args){  
        //调用动态链接库
    	int a, b, c;
    	a = 3;
    	b = 5;
    	c = Nativefunc.add(a, b);
    	System.out.println(c);
    }  
}

Nativefunc.java

package nativetest;

public class Nativefunc {
    static {
    	String currentpath = "";
    	String os = System.getProperty("os.name");
    	if(os.toLowerCase().startsWith("win")) {
    		currentpath = System.getProperty("user.dir") + "\\";
    	} else {
    		currentpath = System.getProperty("user.dir") + "/";
    	}
        System.load(currentpath + "add.dll");
    }

    public static native int add(int a, int b);
}

add.c

JNIEXPORT jint JNICALL Java_nativetest_Nativefunc_add (JNIEnv *p, jclass c, jint a, jint b)
{
    return a + b;
}


联系我们
地址:
武汉市洪山区蓝晶国际7栋903
QQ:
932773931
电话:
027-59761089-806
手机:
13397158231
邮箱:
jevian_ma@worldflying.cn
×
物联网组态平台
试用账号:123456
试用密码:123456
如需测试更多功能或者有疑问可发送邮件至:jevian_ma@worldflying.cn
×
积木编程平台
试用方式:试用手机号码注册即可使用
如需测试更多功能或者有疑问可发送邮件至:jevian_ma@worldflying.cn