Java通过JNI调用C++动态链接库dll,并打在jar包内

您所在的位置:网站首页 jni代码 Java通过JNI调用C++动态链接库dll,并打在jar包内

Java通过JNI调用C++动态链接库dll,并打在jar包内

2024-07-02 10:07| 来源: 网络整理| 查看: 265

Java通过JNI调用C++动态链接库dll,并打在jar包内——JNA-JNI(一)

系列文章: Java通过JNI调用C++动态链接库dll,并打在jar包内 ——JNA-JNI(一) Java使用JNA调用C++动态链接库——JNA-JNI(二) Mac M1 Xcode创建动态链接库dylib(c++)——JNA-JNI(三) JNA调用dll(c++)附带解析xml——JNA-JNI(四) JNA参数类型转换(含接收、发送结构体)——JNA-JNI(五)

目录 Java通过JNI调用C++动态链接库dll,并打在jar包内——JNA-JNI(一)JNI介绍创建JAVA项目C++对应的JAVA对象类windows环境下制作C++动态链接库JAVA程序调用打jar包windows平台下遇到的问题

JNI介绍

JNI(Java Native Interface):允许Java代码和其他语言(尤其C/C++)写的代码进行交互,只要遵守调用约定即可。首先看下JNI调用C/C++的过程,注意写程序时自下而上,调用时自上而下。

xx.dll就像中介一样,Java通过调用这个中介Dll中的自定义方法,间接调用真正的第三方Dll

项目以windows为例,后缀为dll,若为linux,后缀修改为so即可。

创建JAVA项目

这里我用的是spring(为了扩展),使用纯java也是可以的。项目结构如下:

C++对应的JAVA对象类 类的内容 public class Demo { public native void sayHello(int x,int y); } 生成.class文件 javac Demo.java 生成.h文件

错误: 找不到 ‘Demo’ 的类文件。

切换到目录src\main\java\这个目录下,重新执行

javah com.example.demo.Demo

执行成功之后会在com包同级目录下出现一个xx.h的文件。

windows环境下制作C++动态链接库

使用VS2017来演示

新建空项目

将.h文件复制过来并添加

无法打开包括文件:“xxx.h”: No such file or directory.错误。

出现此问题的原因:把头文件复制,直接选择项目粘贴进来,虽然解决方案资源管理器里显示此头文件,但是编译就出现上面的错误,找不到头文件。打开项目目录,发现里面不存在刚才复制的头文件,这是微软的BUG,需要打开项目目录把文件复制过来。所以引用头文件的正确顺序是,先把头文件复制到项目目录里,然后选择打开VS,选择项目右键->添加->现有项,选择复制到项目里的头文件。 /* DO NOT EDIT THIS FILE - it is machine generated */ #include "jni.h" /* Header for class com_example_demo_Demo */ #ifndef _Included_com_example_demo_Demo #define _Included_com_example_demo_Demo #ifdef __cplusplus extern "C" { #endif /* * Class: com_example_demo_Demo * Method: sayHello * Signature: (II)V */ JNIEXPORT void JNICALL Java_com_example_demo_Demo_sayHello (JNIEnv *, jobject, jint, jint); #ifdef __cplusplus } #endif #endif 编写接口实现cpp文件 #include #include "com_example_demo_Demo.h" using namespace std; JNIEXPORT void JNICALL Java_com_example_demo_Demo_sayHello(JNIEnv *env, jobject obj, jint x, jint y) { cout 配置属性---->VC++ 目录---->库目录

添加路径 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib

LNK1158:无法运行“rc.exe”

项目属性-常规-平台工具集里,将Visual Studio 2013 (v120)替换为Visual Studio 2013 - Windows XP (v120_xp)。

打开系统环境变量列表(我的电脑—>属性—>高级—>环境变量),在系统变量栏里看Path,添加:C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Bin\;

其他可能需要的目录,来自https://www.cnblogs.com/Jimnny/p/3574368.html

C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET Web Pages\v1.0\; C:\Program Files (x86)\Windows Kits\8.0\Windows Performance Toolkit\; C:\Program Files\Microsoft SQL Server\110\Tools\Binn\; C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\; C:\Users\(用户名)\AppData\Local\Microsoft\MSBuild\v4.0\;

Can’t load IA 32-bit .dll on a AMD 64-bit platform

原因:xx.dll是32位的不支持64位的平台(jdk环境)

解决方法:VS使用x64重新编译(VS默认是32位)

step 1

step 2

step 3 把ARM改为x64,其他不动

step 4

step 5 运行

getresourceasstream方法获取值为null

解决方法:重新配置一下pom.xml的build,刷新maven库

org.springframework.boot spring-boot-maven-plugin

离线环境打包失败

方法:使用打包命令

mvn clean install -Dmaven.test.skip=true


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3