java 通过JNI/JNA调用C/C++.dll/.so本地方法库

简介

因项目中使用的数据要经过一系列的算法处理,而算法是由传感器供应商提供的是C写的并且不开放算法,这就导致不用直接用java处理了。在这前提下搜索了大量资料,最开始用的是JNI找了很多资料踩了很多坑直接编译就不通过。后面使用JNA顺利调用成功,过程中踩坑浪费大量时间。现把过程都贴出来尽可能的让大家少踩坑。如果哪里有错误欢迎大佬指正。

步骤

1、动态库.dll/.so

1.1、生成动态库

生成.o文件。注意gcc跟jdk位数,jdk32位gcc也要安装32位,不然会报错。

 gcc -Wall  -c  mydylib.c  -o  mydylib.o
#  linux环境
gcc -shared -fPIC -o  mydylib.so  mydylib.o
#win环境
gcc -shared -fPIC -o  mydylib.dll  mydylib.o

2、导入maven库

  <dependency>
            <groupId>net.java.dev.jna</groupId>
            <artifactId>jna</artifactId>
            <version>4.2.2</version>
        </dependency>

3、创建接口继承Library类

dll文件要放在resoures目录下,windows是.dll linux是.so文件。
在这里插入图片描述

3.1、调用:

调用可能出现的问题点:
1、不是一个应用程序:java调用的函数名跟C/C++声明的函数不一致
2、invalid memory access: C使用内存过大相关。
在这里插入图片描述

3.2、对应C文件入参

在这里插入图片描述

3.3、类型映射表

JNA官方提供的类型映射表
在这里插入图片描述

  • 15
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用 JNI 调用 Windows API 的示例代码: 首先,我们需要编写一个 C 文件,实现我们需要调用的 Windows API 函数,并将其编译成 DLL。例如,我们需要调用 MessageBoxA 函数,可以编写以下代码: ``` #include <windows.h> #include <stdio.h> #include "jni.h" JNIEXPORT void JNICALL Java_com_example_MessageBox_messageBox(JNIEnv* env, jobject obj, jstring message) { const char* utfMessage = (*env)->GetStringUTFChars(env, message, NULL); MessageBoxA(NULL, utfMessage, "Message", MB_OK | MB_ICONINFORMATION); (*env)->ReleaseStringUTFChars(env, message, utfMessage); } ``` 这个函数接受一个字符串参数,调用 Windows API 的 MessageBoxA 函数,并显示消息框。 接下来,我们需要将这个 C 文件编译成 DLL。这里使用 MinGW-w64 编译器,可以使用以下命令: ``` x86_64-w64-mingw32-gcc -shared -o MessageBox.dll MessageBox.c ``` 这将生成一个名为 MessageBox.dllDLL 文件。 现在,我们可以在 Java 中使用 JNI 调用这个 DLL。首先,我们需要加载这个 DLL: ``` System.loadLibrary("MessageBox"); ``` 然后,我们可以调用这个 DLL 中的函数: ``` public class MessageBox { static { System.loadLibrary("MessageBox"); } public static native void messageBox(String message); public static void main(String[] args) { MessageBox.messageBox("Hello from JNI!"); } } ``` 这个 Java 类中包含一个名为 messageBox 的本地方法,它调用了我们刚刚编写的 C 函数。在 main 方法中,我们调用这个本地方法,传入一个字符串参数,这个字符串将被显示在消息框中。 这样,我们就完成了使用 JNI 调用 Windows API 的示例。需要注意的是,这个示例中使用了 MinGW-w64 编译器,如果使用其他编译器,可能需要进行相应的调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值