Linux上java使⽤JNA调⽤CC++函数传参(数组,⼆维数组)
使⽤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;
java jna
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

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。