一、JNI简介
1、什么是JNI:
JNI(Java Native Interface):java本地开发接口
JNI是一个协议,这个协议用来沟通java代码和外部的本地代码(c/c++)
外部的c/c++代码也可以调用java代码
2、为什么使用JNI:
效率上 C/C++是本地语言,比java更高效
代码移植,如果之前用C语言开发过模块,可以复用已经存在的c代码
java反编译比C语言容易,一般加密算法都是用C语言编写,不容易被反编译
二、整体步骤如下:
1.编写java测试类
2.利用java测试类生成C头文件
3.利用C头文件编写C代码
4.生成C库
5.java调用测试
三、详解
1.编写java测试类
eclipse新建java项目:
新建类JNIdemo,其中:System.loadLibrary方法load的是C的类库,名称要与C一致。testHello方法为空方法,我们将在C中实现它。包名com.jin.test、方法名testHello都有与C中对应。
package com.jni.test;
public class JNIdemo {
/**
* @param args
*/
public native void testHello();
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
System.loadLibrary("JniProject1");
JNIdemo jniDemo =new JNIdemo();
jniDemo.testHello();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
2、利用java类生成C头文件
首先打开cmd命令行。然后切换到该java工程的Bin目录下执行以下命令(注意:类名称区分大小写):
javah -classpath . -jni com.jni.test.JNIdemo
然后我们可以在bin目录下找到生成的头文件:
3、用visual studio编写C代码
1.选择文件-》新建-》项目
2.选择(Win32),输入项目名称(即为上面System.loadLibrary方法load的是C的类库名称),项目地址,点击确定。
3.直接点击下一步
4.这里选择DLL,空项目,然后点完成。
5.生成如下如的项目结构
6.在源文件的文件夹上面右键,选择添加-》类。
7.直接点击添加
8.输入类名,点击完成。(C++类)
9.在你的系统JDK安装目录的include目录下有一个jni.h的文件,include的win32目录下有个jni_md.h文件,还有java工程的bin目录下的C头文件,一起拷贝到C工程的JniProject1目录下:(当前工程名就叫JniProject1,工程目录下还有一个JniProject1目录,工程目录-》JniProject1-》jni.h com_jni_test_JNIdemo.h jni_md.h)如下图:
当前目录为工程目录
10.在C项目的头文件文件夹上面右键,添加-》现有项
11.选择jni.h,com_jni_test_JNIdemo.h和jni_md.h
12.打开com_jni_test_JNIDemo.h文件
13.将#include <jni.h>修改为#include "jni.h",错误提示消失。
代码:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class com_jni_test_JNIdemo */
#ifndef _Included_com_jni_test_JNIdemo
#define _Included_com_jni_test_JNIdemo
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT void JNICALL Java_com_jni_test_JNIdemo_testHello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
14.在TestJNI.cpp文件中写入如下代码:
代码:
#include "stdafx.h"
#include "com_jni_test_JNIdemo.h"
#include <iostream>
#include <stdio.h>
JNIEXPORT void JNICALL Java_com_jni_test_JNIdemo_testHello
(JNIEnv *, jobject) {
printf("this is C++ print");
}
15.配置C工程,在解决方案上右键,选择属性
16.做如下配置
如果发现没有x64选择,则可以配置管理器添加。
4、在项目上右键生成,输出如下下信息
下面是生成的dll库
5、在Java项目下如下设置
填写dll库所在路径,保存即可。
运行java类,结果入下。