Linux上java使用JNA调用C/C++函数传参(数组,二维数组)

使用JNA调用C/C++函数的步骤:

1、定义JNA接口API(C/C++).h文件
2、实现.h文件中定义的函数(.c)文件
3、编译.c文件,生成动态库文件(.so)
4、应用JNA的包jna-*.jar,我这里用的是jna-5.6.0.jar
5、定义java接口,加载动态库,并定义相应的API方法
6、通过java接口,调用相应的方法

今天测试了,java和C/C++函数之间一维数组和二维数组的传参。

一维数组

一维数组比较简单,直接上代码:
1、testJNA.h

#include <stdio.h>
void printfArray(int arr[]);

2、testJNA.c

#include "testJNA.h"
void printfArray(int arr[]) {
    
    
    printf("input【%d】",arr[0]);
}

3、Clibrary.java

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

public interface Clibrary extends Library {
    
    
    Clibrary INSTANCE = (Clibrary) Native.load("testJNA", Clibrary.class);
    void printfArray(int[] arr);
}

4、调用

    public static void main(String[] args) {
    
    
        int[] a = new int[]{
    
    1,2};
        Clibrary.INSTANCE.printfArray(a);
    }

二维数组

二维数组比较麻烦,因为JNA不能自动将java的二维数组转换成C的二维数组(也许支持,本人不熟悉没有找到相应的方法,如果更好方法,还请留言指教),我在这里自定义了一个对象
1、testJNA.h

#include <stdio.h>

typedef struct
{
    
    
    int a[2];
}Ershuzu;

void printfERArray(Ershuzu arr[],int size);

2、testJNA.c

#include "testJNA.h"

void printfERArray(Ershuzu arr[],int size) {
    
    
    for(int i = 0;i < size; i++) {
    
    
        for(int j = 0;j < 2;j++)
        printf("arr[%d][%d]input【%d】",i,j,arr[i].a[j]);
    }
}

3、Ershuzu.java

import com.sun.jna.Structure;

import java.util.Arrays;
import java.util.List;

public class Ershuzu extends Structure {
    
    
    public int[] a = new int[2];
    public static class ByReference extends Ershuzu implements Structure.ByReference {
    
    }
    public static class ByValue extends Ershuzu implements Structure.ByValue {
    
    }

    @Override
    protected List<String> getFieldOrder() {
    
    
        return Arrays.asList(new String[]{
    
    "a"});
    }
}

4、Clibrary.java

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

public interface Clibrary extends Library {
    
    
    Clibrary INSTANCE = (Clibrary) Native.load("testJNA", Clibrary.class);

   void printfERArray(Ershuzu[] er,int size);
}

5、调用

   public static void main(String[] args) {
    
    
        Ershuzu[] ershuzus = (Ershuzu[]) new Ershuzu().toArray(2);
        ershuzus[0].a = new int[]{
    
    1,2};
        ershuzus[1].a = new int[]{
    
    3,4};
        Clibrary.INSTANCE.printfERArray(ershuzus,ershuzus.length);
   }

编译测试

将.h和.c文件放到同一目录下进行编译

gcc -m64 -fPIC -c ./*.c -I./ -std=c99
gcc -m64 -shared -o libtestJNA.so *.o
rm -f *.o
javac -cp :./jna-5.6.0.jar TestJNA.java
java -cp :./jna-5.6.0.jar TestJNA

猜你喜欢

转载自blog.csdn.net/wzl19870309/article/details/110771531