Jna及如何调试
最近项目使用到了java调用c库的技术,除了传统的Jni,查资料发现Jna技术更为简便,搭建起来更为方便。便使用Jna技术进行调用c库,由于使用的c库是由自己进行编写编译的,所以其中的结构体更为简单。假如需要使用到更为复杂的结构体,则建议使用swig技术更为方便。
相关文档
在查阅资料后发现以下文章具有重要参考意义,遇到问题可以进行查阅学习:
简单使用
这 里仅做简单使用说明,其中复杂的语法请查考上面的官方文档
导入依赖
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>4.1.0</version>
</dependency>
导入编译好的c库
在本系统下编译出适配该系统的动态库,复制至java项目中具有resources性质的文件夹中,并根据以下命名方式命名文件夹:
文件夹名 | 对应相应系统及位数 |
---|---|
darwin | mac系统 |
linux-x86 | 32位linux系统 |
linux-x86-64 | 64位linux系统 |
win32-x86 | 32位window系统 |
win32-x86-64 | 64为window系统 |
封装接口
import com.sun.jna.*;
public interface Clibrary extends Library {
//假设动态库是位于linux系统下,名字为libclibrary.so
Clibrary instance = (Clibrary) Native.loadLibrary("clibrary.so", Clibrary.class);
//与动态库中的函数相对应,例如动态库中有函数helloworld()
void helloworld();
}
调试
我是在ubuntu系统下进行调试,使用的是idea和clion编译器进行编写,idea进行java代码编写,clion进行c代码编写,调试需要使用到两个编译器。
步骤
-
首先clion中编译出的动态库是debug版本,并放置在idea相应位置
-
确定要调试的位置,进行打断点操作
-
idea启动调试,但此时先不进行step over操作
-
在jdk目录下找到jps命令,使用jps命令查看此时所有运行的java进程,找到此时idea调试进程的pid号:
> jps -l
-
至clion下菜单栏中,Run->Attach to Process(或ctrl+alt+F5)打开追钟进程断点,输入刚刚查看的pid号,clion进行调试状态
-
在idea中进行调试,若clion中含断点,则会跳转至clion进行c层面的调试
问题
若在ubuntu系统下出现:ptrace: Operation not allowed, Debugger detached错误,使用下方文档进行修改:Attach to process
> vim etc/sysctl.d/10-ptrace.conf
> 修改kernel.yama.ptrace_scope = 1 为 kernel.yama.ptrace_scope = 0
> echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope