0%

Java 操作 C++ 底层代码

JNI

JNI 全称 Java 动态接口(Java Native Interface),专门于为其他语言提供自己的规范

  • 作用是融合不同的编程语言为 Java 所用,初衷是融合 C/C++ 程序

步骤说明

  • Java 交予 JVM 编译得到二进制文件(.class),再编译生成 C++ 头文件(.h)

  • 在相应.cpp 文件中引入

  • 通过 DLL 项目生成 64 bit 动态链接库(.dll)

  • 将动态链接库存放于 % JAVA_HOME% 路径,供 API 调用

具体操作

JavaToCpp

  • 编写 Java 类,声明 sayHello () 方法

    • 一个 Native Method 就是一个 Java 调用非 Java 代码的接口,就如 C++ 中可用 extern 告知编译器调用一个 C 函数
1
2
3
4
5
6
7
public class Test {
public native void sayHello();

static {
System.loadLibrary("CppToJava");
}
}
  • 生成 JNI 头文件

1
javah -jni -classpath ./ Test

CppToJava

  • 创建 DLL 项目,引入该头文件

  • 实现 sayHello () 本地方法

1
2
3
4
5
6
7
#include <iostream>

#include "Test.h"

JNIEXPORT void JNICALL Java_Test_sayHello(JNIEnv*, jobject) {
std::cout << "im from cpp" << std::endl;
}
  • 指定 x64 平台,生成解决方案

Main

  • 需要先将生成的动态链接库放至 % JAVA_HOME% 路径

  • 调用

1
2
3
4
5
public static void main(String[] args) {
// 当前path,如本机位置D:\Java\jdk1.8\bin
// System.out.println(System.getProperty("java.library.path"));
new Test().sayHello();
}

Q&A

Q:出现以上报错?

A:这是因为生成的 DLL 是 32 位的不支持 64 位的平台(jdk 环境),应在生成时指定为 64 位 DLL