IntelliJ IDEA平台下JNA编程

JNA简单介绍

  • JNA(Java Native Access)是一个开源的Java框架,是Sun公司推出的一种调用本地方法的技术,是建立在经典的JNI基础之上的一个框架。之所以说它是JNI的替 代者,是因为JNA大大简化了调用本地方法的过程,使用很方便,基本上不需要脱离Java环境就可以完成。
  • JNA只需要我们写Java代码而不用写JNI或本地代码(适配用的.dll/.so)只需要在Java中编写一个接口和一些代码,作为.dll/.so的代理,就可以在Java程序中调用dll/so。功能相对于Windows的Platform/Invoke和Python的ctypes。

    JNA的简单实例在下边,需要注意的就是,dll/so库的加载路径问题

  • Native.loadLibrary(“hzh”, CLibrary.class)会自动去项目的根目录下找dll,因此位置一定要放对,不然会报找不到dll库的错误

首先在pom中加入JNA的依赖

    <dependency>
      <groupId>com.sun.jnagroupId>
      <artifactId>jnaartifactId>
      <version>3.0.9version>
    dependency>

其次是编写Java方法

package com.zhonghao;

import com.sun.jna.Library;
import com.sun.jna.Native;

/**
 * Created by zhonghao.han on 9/12/2018.
 */
public class JnaTest {
  //继承Library,用于加载库文件
  public interface Clibrary extends Library{
    //加载libhello.so链接库
    Clibrary INSTANTCE = (Clibrary) Native.loadLibrary("helloworld", Clibrary.class);

    //此方法为链接库中的方法
    void test();
  }

  public static void main(String[] args) {
    //调用
    Clibrary.INSTANTCE.test();
  }
}

其次编写C 的方法helloworld.h

#include
void test(){
printf("helloworld\n");
}

这样就可以了

同时将C代码helloworld.h编译成dll.至于怎么编译这里推荐一个大神的博客
JNI的中用到的技术,包括dll在IDEA中的工具编译

然后将dll文件放到工程根目录下,运行即可!

为什么是根目录下呢?因为Native.loadLibrary第 一个参数是动态链接库dll/so的名称,但不带.dll或.so这样的后缀,这符合JNI的规范,因为带了后缀名就不可以跨操作系统平台了。搜索动态链 接库路径的顺序是:先从当前类的当前文件夹找,如果没有找到,再在工程当前文件夹下面找win32/win64文件夹,找到后搜索对应的dll文件,如果 找不到再到WINDOWS下面去搜索,再找不到就会抛异常了。

这里只给出了实例,并没有说明。

项目地址点击这里

你可能感兴趣的:(Java调用C/C++,Java与C/C++的连接大桥)