JNI(Java Native Interface)
Java調用C/C++,C/C++調用Java的一套API
前言:
學習JNI需要C/C++的相關知識,而且需要研究JNI手冊.
想學習的同學,請follow我的學習筆記NDK開發學習筆記
1:在eclipse中編寫native方法
public class Java2cpp {
static {
System.loadLibrary("Project4");
}
public native int DLL_ADD(int a,int b);//加
public native int DLL_SUB(int a,int b);//減
public native int DLL_MUL(int a,int b);//乘
public native int DLL_DIV(int a,int b);//除
public static void main(String args[]){
int sum = 0;
Java2cpp test = new Java2cpp();
sum = test.DLL_ADD(2, 4);
System.out.println("Java call cpp dll result:" + sum);
}
}
}
2.javah命令,生成.h頭文件
第一步:javac Java2cpp.java 生成java2cpp.class
-
第二步:javah Java2cpp 生成Java2cpp.h頭文件,內容如下:
cmd操作
//生成的C++頭文件Java2cpp.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class Java2cpp */
#ifndef _Included_Java2cpp
#define _Included_Java2cpp
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Java2cpp
* Method: DLL_ADD
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_Java2cpp_DLL_1ADD
(JNIEnv *, jobject, jint, jint);
/*
* Class: Java2cpp
* Method: DLL_SUB
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_Java2cpp_DLL_1SUB
(JNIEnv *, jobject, jint, jint);
/*
* Class: Java2cpp
* Method: DLL_MUL
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_Java2cpp_DLL_1MUL
(JNIEnv *, jobject, jint, jint);
/*
* Class: Java2cpp
* Method: DLL_DIV
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_Java2cpp_DLL_1DIV
(JNIEnv *, jobject, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
3.復制.h頭文件,jni.h和jni_md.h到CPP工程中
-
用visual studio新建空C++項目,引入頭文件Java2cpp.h,這邊因為沒有jni.h和jni_md.h,我們也要導入(jni.h和jni_md.h在jdk的lib中),
項目結構
4.實現.h頭文件中聲明的函數
編寫頭文件Java2cpp.h的實現即testdll.cpp.部分代碼如下.
#include "Java2cpp.h"
/*
* Class: Java2cpp
* Method: DLL_ADD
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_Java2cpp_DLL_1ADD
(JNIEnv *env, jobject obj, jint a, jint b){
int var = 0;
var = a + b;
return var;
}
/*
* Class: Java2cpp
* Method: DLL_SUB
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_Java2cpp_DLL_1SUB
(JNIEnv *env, jobject obj, jint a, jint b){
int var = 0;
var = a-b;
return var;
}
5.生成dll文件
-
配置文件,右鍵上3圖項目結構選擇屬性
這里寫圖片描述 生成解決方案即可
6.配置dll文件所在目錄到環境變量
將dll文件所在目錄配置到Path中,例如我把dll放在 D:\DllTools ,
則需要將 D:\DllTools; 添加到path的最前面.
7.重啟Eclipse
重啟查看結果
public class Java2cpp {
static {
System.loadLibrary("Project4");
}
public native int DLL_ADD(int a,int b);//加
public native int DLL_SUB(int a,int b);//減
public native int DLL_MUL(int a,int b);//乘
public native int DLL_DIV(int a,int b);//除
public static void main(String args[]){
int sum = 0;
Java2cpp test = new Java2cpp();
sum = test.DLL_ADD(2, 4);
System.out.println("Java call cpp dll result:" + sum);
}
}
//console 顯示的結果
Java call cpp dll result:6