1、pom文件添加jna依赖
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.14.0</version>
</dependency>
2、注意问题
要实现Java调用C++的动态库,需要使用"extern C"关键字。该关键字是C++之父在设计C++时,为兼容已存在的大量C代码而设定的方法。用该关键字将C++的函数包含起来,即可将C++按C语言的方式进行编译。
3、验证环节 没有extern C的c++文件 文件名 cplus2.cpp
#include<stdio.h>
int sayCplus()
{
printf("Hello, C++\n");
return 0;
}
4、c++代码头文件 文件名cplus.h
#ifndef _CPLUS_H_
#define _CPLUS_H_
int sayCplus();
#endif
5、g++编译代码 cplus.h和cplus2.cpp需在同一个文件夹下
g++ -shared -o mycpp2.dll cplus2.cpp
生成动态库 mycpp2.dll文件,吧该文件放到 C:\Windows\System32 目录下
6、java代码调用, mycpp2.dll 动态库加载
package com.pojo.util;
import com.sun.jna.Library;
import com.sun.jna.Native;
public interface MyCpp2 extends Library {
// 加载mycpp2.dll
MyCpp2 INSTANCE = (MyCpp2) Native.load("mycpp2", MyCpp2.class);
int sayCplus();
}
具体调用 和报错信息
package com.pojo.util;
public class MyCppTest {
public static void main(String[] args) {
// int num = MyCpp.INSTANCE.sayCplus();
// System.out.println(num);
int num2 = MyCpp2.INSTANCE.sayCplus();
System.out.println(num2);
}
}
报错信息
Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function 'sayCplus': 找不到指定的程序。
7、正确做法 c++代码添加 extern "C" 修改如下 文件cplus.cpp 如下
#include<stdio.h>
extern "C"
{
int sayCplus()
{
printf("Hello, C++\n");
return 0;
}
}
8、cplus.h文件内容不变
9、编译成 mycpp.dll动态库
g++ -shared -o mycpp.dll cplus.cpp
生成动态库 mycpp.dll文件,吧该文件放到 C:\Windows\System32 目录下
10、java代码调用,动态加载 mycpp.dll
package com.pojo.util;
import com.sun.jna.Library;
import com.sun.jna.Native;
public interface MyCpp extends Library {
// 加载 mycpp.dll
MyCpp INSTANCE = (MyCpp) Native.load("mycpp", MyCpp.class);
int sayCplus();
}
具体调用和调用结果
package com.pojo.util;
public class MyCppTest {
public static void main(String[] args) {
int num = MyCpp.INSTANCE.sayCplus();
System.out.println(num);
// int num2 = MyCpp2.INSTANCE.sayCplus();
// System.out.println(num2);
}
}