版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/sxj159753/article/details/77658109
目的
本次的目的是用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");
}