使用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