java调用CPP代码开发示例

78 阅读1分钟

一、编写java代码

public class NativeCaller {​

// 声明native方法,注意这里只有方法声明,没有方法体​

public native int add(int a, int b);​


// 加载动态链接库,库名需与后续生成的动态链接库名一致​

static {​

System.loadLibrary("NativeCaller");​

}​

}

二、根据Java代码生成头文件

javah -classpath D:\myProject\TestNativeMethod\src -jni NativeCaller
/* DO NOT EDIT THIS FILE - it is machine generated */  
#include <jni.h>  
/* Header for class NativeCaller */  
  
#ifndef _Included_NativeCaller  
#define _Included_NativeCaller  
#ifdef __cplusplus  
extern "C" {  
#endif  
/*  
 * Class:     NativeCaller * Method:    add * Signature: (II)I */JNIEXPORT jint JNICALL Java_NativeCaller_add  
  (JNIEnv *, jobject, jint, jint);  
  
#ifdef __cplusplus  
}  
#endif  
#endif

三、编写头文件实现

在这个 C++ 代码中,Java_NativeCaller_add函数是对 Java 中NativeCaller类的add方法的实现。JNIEnv指针提供了 JNI 的各种函数调用接口,jobject表示调用该方法的 Java 对象,jint是 JNI 中对应 Java int类型的数据类型。

#include <jni.h>  
#include "NativeCaller.h"  
#include <iostream>  
  
// 实现Java中声明的add方法  
JNIEXPORT jint JNICALL Java_NativeCaller_add  
  (JNIEnv *env, jobject obj, jint a, jint b) {  
    return a + b;  
}

四、打dll链接库

-shared生成共享库,-o指定输出文件名,-I指定jni.h及其相关头文件所在目录,路径需根据实际安装的 JDK 路径调整。生成的动态链接库文件名需遵循 Linux 下共享库命名规范,以lib开头。


win
g++ -shared -o NativeCaller.dll NativeCaller.cpp -I "D:\jdk-21.0.2\include" -I "D:\jdk-21.0.2\include\win32"

linux
g++ -shared -o [libNativeCaller.so](http://libNativeCaller.so) NativeCaller.cpp -I /usr/lib/jvm/java-11-openjdk-amd64/include -I /usr/lib/jvm/java-11-openjdk-amd64/include/linux
​

五、拷贝dll文件到bin目录

D:\jdk-21.0.2\bin