0%

JAVA与C++交互(JNI)

JNI

编写Java类

1
2
3
4
5
6
7
8
9
10
11
package cn.hnzdf.brakePlatform.maven;

public class TestMain{
public native void testHello();
public static void main(String[] args){
System.loadLibrary("TestMain");
TestMain jniDemo = new TestMain();
jniDemo.testHello();
}
}

生成头文件

1
javac -h .  cn\hnzdf\brakePlatform\maven\TestMain.java

执行后会在路径下生成头文件,cn_hnzdf_brakePlatform_maven_TestMain.h

image-20220804144508009

编写c++代码

在Visual Studio中新建项目

选择动态链接库

image-20220804144301505

image-20220804144345606

建完以后的结构

image-20220804144416544

将必要头文件拷贝进项目

  1. 需要具体实现的头文件,cn_hnzdf_brakePlatform_maven_TestMain.h;
  2. jni.h,该文件在jdk安装目录下,如:D:\ENV\Java\jdk-11.0.11\include\jni.h
  3. jni_md.h,该文件在jdk安装目录下,如:D:\ENV\Java\jdk-11.0.11\include\win32\jni_md.h

一定要使用vs自己的导入,切不可直接粘贴

一定要使用vs自己的导入,切不可直接粘贴

一定要使用vs自己的导入,切不可直接粘贴

image-20220804145056181

新建实现类

右键源代码,直接创建类

image-20220804145441318image-20220804145734320

在类的头文件中导入必要依赖

image-20220804145804999

在TestMain.cpp中写入以下内容,注意”pch.h”必须依赖

1
2
3
4
5
6
7
8
9
#include "pch.h"
#include "TestMain.h"
#include <iostream>
#include <stdio.h>

JNIEXPORT void JNICALL Java_cn_hnzdf_brakePlatform_maven_TestMain_testHello
(JNIEnv*, jobject) {
printf("this is C++ print");
}

引用调整

生成的头文件中的引用,

1
2
3
4
// 原来
#include <jni.h>
// 改为
#include "jni.h"

生成

右键解决方案,点击生成

image-20220804150014717

将生成的dll拷贝至jdk安装目录的bin目录下

调用

1
2
3
4
5
6
public static void main(String[] args){
// 这里不要写dll后缀
System.loadLibrary("TestMain");
TestMain jniDemo = new TestMain();
jniDemo.testHello();
}

image-20220804150151500

Donate comment here.