您的位置:首页 > 其它

JNI开发流程(Windows下)

2017-08-28 22:00 218 查看

目的

本次的目的是用java调用windows下C生成的.dll库。

需要的工具 vs studio2013 ,eclipse

JNI(Java Native Interface):Java调用C/C++,C/C++调用Java的一套API

编写native方法

首先写一个java工程,代码如下:

public class JniTest {

public native static String getStringFromC();

public static void main(String[] args) {

}
}


我们通过javah命令生成一个头文件。配置jdk环境变量。



切换到工程目录


javah命令,生成.h头文件

使用javah命令生成 注意要是这个类的完整类名



刷新eclipse工程就会看见这个文件

复制.h头文件到CPP工程中

我们在vsStudio中新建一个项目。



新建一个类



将生成的头文件和新建的文件放到一起。



实现.h头文件中声明的函数

回到vsStudio 选中头文件,然后添加->现有项,把jniTest_JniTest.h添加进去。

我们查看一下jniTest_JniTest.h,发现报错。我们需要把jdk中的jni.h和添加进去。

进入到jdk目录



搜索jni.h



在jniTest_JniTest.h中修改
#include <jni.h>
#include "jni.h"
保存。

我们在01.c文件中可以编写代码了。

#include "jniTest_JniTest.h"
//函数实现 C的函数名称:Java_完整类名_函数名
JNIEXPORT jstring JNICALL Java_jniTest_JniTest_getStringFromC
(JNIEnv *env, jclass jcls){
//简单的实现
//将C的字符串转换为一个java字符串
return (*env)->NewStringUTF(env,"C string");
}


生成dll文件

接下来我们需要生成.dll文件,通过vs生成。

debug->配置管理器->在活动解决方案平台中新建一个选项。



因为我是64位操作系统,选择:



属性这块选择生成dill动态库(右键项目->属性):



生成-解决方案。



之后就可以在eclipse中加载动态库了

如下代码:

public class JniTest {

public native static String getStringFromC();

public static void main(String[] args) {
String stringFromC = getStringFromC();
System.out.println(stringFromC);
}
//添加的动态库。
static {
System.loadLibrary("JniProject");
}
}


配置dll文件所在目录到windows系统的环境变量.

配置环境变量是为了找到库的位置,



或者直接放到eclipse的工程目录下。也可以进行编译

重启Eclipse

最后将动态库的位置配置到环境变量里面就可以找到动态库了

运行结果:



一些简要的知识点:

JNIEnv

- 在C中:

JNIEnv 结构体指针别名

env二级指针

在C++中:

JNIEnv 是一个结构体的别名

env 一级指针

c中,函数执行过程中需要传入jnienv

JNIEXPORT jstring JNICALL Java_jniTest_JniTest_getStringFromC
(JNIEnv *env, jclass jcls){
//简单的实现
//将C的字符串转换为一个java字符串
return (*env)->NewStringUTF(env,"C string");
}


C++,不用去传,因为C++中有this关键字。

JNIEXPORT jstring JNICALL Java_jniTest_JniTest_getStringFromC
(JNIEnv *env, jclass jcls){
//不用传
return env->NewStringUTF("C string");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: