我的环境
JDK 1.8.0_241 64 位
C:\Users\Administrator\Desktop\jna-func-master>java -version java version "1.8.0_241" Java(TM) SE Runtime Environment (build 1.8.0_241-b07) Java HotSpot(TM) 64-Bit Server VM (build 25.241-b07, mixed mode)
VS 2019
Windows 10
大体思路是,C++ 生成 dll 动态链接库,Java 调用 dll。
C++
抄一个 c++ 代码
参考 :https://blog.csdn.net/Giser_D/article/details/89677441
pch.h
// pch.h: 这是预编译标头文件。 // 下方列出的文件仅编译一次,提高了将来生成的生成性能。 // 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。 // 但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。 // 请勿在此处添加要频繁更新的文件,这将使得性能优势无效。 #ifndef PCH_H #define PCH_H // 添加要在此处预编译的标头 #include "framework.h" #endif //PCH_H //定义宏 #ifdef IMPORT_DLL #else #define IMPORT_DLL extern "C" _declspec(dllimport) //指的是允许将其给外部调用 #endif IMPORT_DLL int add(int a, int b); IMPORT_DLL int minus(int a, int b); IMPORT_DLL int multiply(int a, int b); IMPORT_DLL double divide(int a, int b);
pch.cpp
// pch.cpp: 与预编译标头对应的源文件 #include "pch.h" // 当使用预编译的头时,需要使用此源文件,编译才能成功。 int add(int a, int b) { return a + b; } int minus(int a, int b) { return a - b; } int multiply(int a, int b) { return a * b; } double divide(int a, int b) { double m = (double)a / b; return m; }
右击项目生成
控制台可以看到你 dll 生成的目录,生成完测试一下。
- 生成一个控制台程序
ConsoleApplication1.cpp
// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include <iostream> #include <Windows.h> int main() { HINSTANCE hDllInst; hDllInst = LoadLibrary(L"C:\\Users\\Administrator\\Desktop\\testDll.dll"); //调用DLL typedef int(*PLUSFUNC)(int a, int b); PLUSFUNC plus_str = (PLUSFUNC)GetProcAddress(hDllInst, "add"); //GetProcAddress为获取该函数的地址 std::cout << plus_str(1, 2); // std::cout << "Hello World!\n"; }
run
Java
JNA 调用 dll
导包
<dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna</artifactId> <version>5.3.1</version> </dependency>
import com.sun.jna.Library; import com.sun.jna.Native; public class TestDll { public interface MyLibrary extends Library { // testDll 为 dll 名称 Hello.MyLibrary INSTANCE = Native.load("testDll", Hello.MyLibrary.class); int add(int a, int b); int minus(int a, int b); int multiply(int a, int b); double divide(int a, int b); } public static void main(String[] args) { int test = Hello.MyLibrary.INSTANCE.add(1,1); System.out.println(test); } }
刚才生成的 dll 放到 jdk 目录里去
右击 run
坑
java.lang.UnsatisfiedLinkError: 找不到指定的模块。
生成的 dll 一定要用 vs 自己跑一下看看 dll 生成的有没有问题,dll 要放到 jdk bin 目录下,jdk 环境变量要配好。
1%不是有效的 32 位程序
看看 dll 和 jdk 是不是都是 32 或者 64
参考资料:
https://www.jianshu.com/p/ead89497c403
https://blog.csdn.net/Giser_D/article/details/89677441
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于