小沃今天个大家讲的课是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文件
将生成的*.h中的#include <jni.h>修改为#include "jni.h"
将jdk安装目录中的include文件夹下的jni.h与include/win32文件夹下的jni_md.h放到与c文件同级目录下。
最后执行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; }