Java调用C/C++,C/C++调用Java的一套API
学习JNI需要C/C++的相关知识,而且需要研究JNI手册.
想学习的同学,请follow我的学习笔记NDK开发学习笔记
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);
}
}
}
第一步:javac Java2cpp.java 生成java2cpp.class
第二步:javah Java2cpp 生成Java2cpp.h头文件,内容如下:
注意 javah 错误: 找不到 ‘XXX’ 的类文件。方法:
到这个目录$ProjectPath\bin而不是.class文件所在的目录
javah 包名.类名
或者:
javah -classpath F:/WorkSpace/NetBeansProjects/MwIC32/build/classes mwic32.Main
//生成的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
编写头文件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;
}
将dll文件所在目录配置到Path中,例如我把dll放在 D:\DllTools ,
则需要将 D:\DllTools; 添加到path的最前面.
重启查看结果
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