Jna及如何调试

Jna及如何调试

最近项目使用到了java调用c库的技术,除了传统的Jni,查资料发现Jna技术更为简便,搭建起来更为方便。便使用Jna技术进行调用c库,由于使用的c库是由自己进行编写编译的,所以其中的结构体更为简单。假如需要使用到更为复杂的结构体,则建议使用swig技术更为方便。

相关文档

在查阅资料后发现以下文章具有重要参考意义,遇到问题可以进行查阅学习:

  1. 官方文档
  2. github文档
  3. 博客:JNA教程(入门)
  4. 博客:Java调用C/C++动态库(入门)

简单使用

这 里仅做简单使用说明,其中复杂的语法请查考上面的官方文档

导入依赖
<dependency>
    <groupId>net.java.dev.jnagroupId>
    <artifactId>jnaartifactId>
    <version>4.1.0version>
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代码编写,调试需要使用到两个编译器。

步骤
  1. 首先clion中编译出的动态库是debug版本,并放置在idea相应位置

  2. 确定要调试的位置,进行打断点操作

  3. idea启动调试,但此时先不进行step over操作

  4. 在jdk目录下找到jps命令,使用jps命令查看此时所有运行的java进程,找到此时idea调试进程的pid号:

    > jps -l
    
  5. 至clion下菜单栏中,Run->Attach to Process(或ctrl+alt+F5)打开追钟进程断点,输入刚刚查看的pid号,clion进行调试状态

  6. 在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

你可能感兴趣的:(java,java,jna,调试)