文章目录
1. JNI的基本介绍
JNI: Java Native Interface, Java本地接口,使得Java程序可以调用C++程序
类型转换:
方法签名:
数据类型及对应字符:
2. 简单使用
1. 在eclipse中创建一个项目,建立一个包,创建一个JNI测试类,项目结构如下:
package jni;
public class JNITest {
static {
System.load("D:\\eclipse_java\\SGXDemo\\src\\JNIDll.dll");
//System.loadLibrary("JNIDll");
}
public static void main(String[] args) {
JNITest jniTest = new JNITest();
jniTest.javaCallNative();
int sum=jniTest.nativeAdd(1,2);
System.out.println("sum= "+sum);
}
/*
* 以下是两个本地方法 在c++中实现
*/
public native void javaCallNative();
public native int nativeAdd(int a,int b);
}
2. 将jni.h、jni_md.h头文件复制一份到SGXDemo的src目录下
这两个文件存在与jdk的安装目录下:
3. 生成JNITest.h文件,不需要手动,通过命令行生成
输入命令后,在src目录下会有一个jni_JNITest.h文件,内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class jni_JNITest */
#ifndef _Included_jni_JNITest
#define _Included_jni_JNITest
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: jni_JNITest
* Method: javaCallNative
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_jni_JNITest_javaCallNative
(JNIEnv *, jobject);
/*
* Class: jni_JNITest
* Method: nativeAdd
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_jni_JNITest_nativeAdd
(JNIEnv *, jobject, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
对上面的jni_JNITest.h做一个修改,#include <jni.h>-->#include "jni.h"
4. 编写jni_JNITest.cpp文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "jni_JNITest.h"
JNIEXPORT void JNICALL Java_jni_JNITest_javaCallNative
(JNIEnv * env, jobject jObj) {
printf("Java_jni_JNITest_javaCallNative---->\n");
}
JNIEXPORT jint JNICALL Java_jni_JNITest_nativeAdd
(JNIEnv *, jobject jobj, jint a, jint b){
printf("in c++: %d+%d=%d",a,b,a+b);
return a+b;
}
5. 编译、生成dll文件
gcc -c jni_JNITest.cpp
gcc -shared -o JNIDll.dll jni_JNITest.o
经过编译、链接操作后,src目录下会出现一个JNIDll.dll文件
6. 运行
运行结果如下:
static {
System.load("D:\\eclipse_java\\SGXDemo\\src\\JNIDll.dll");
//System.loadLibrary("JNIDll");
}
这里用的是load,写的的绝对路径,并且加上了dll后缀,如果要使用第2种loadLibrary的方式,需要进行如下操作:
右键项目->Build Path->Configure Build Path, 进入如下界面
选择本地库的路径,这里我们选择的是项目的src目录,因为dll文件在该目录下,然后使用第2种加载方式进行加载,运行结果和第一种加载相同