JNI开发流程(Windows下)

版权声明:本文为博主原创文章,转载请注明出处。 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");
}

猜你喜欢

转载自blog.csdn.net/sxj159753/article/details/77658109
今日推荐