JNI提供了Java和native代码相互调用的接口,注意是相互调用,不仅仅是Java可以调用native,native也是可以调用Java的。但是使用的时候,我们会遇到一些问题,本文介绍一下Java对象和底层结构体的转换。
Java 对象
我们有Person类,
public class Person {
public int ID;
public String name;
public byte[] data;
}
底层结构体
Student结构体,由于我们底层采用c实现,而c没有字符串类型(C++有),所以我们采用char数组来存储字符串。
typedef struct {
int ID;
char name[255];
char data[255];
} Student;
我们来介绍,如何将Student对象传递到底层,并将其转换为底层Student结构体。
NDK配置
首先,我们新建一个JNIUtils类,用来从java调用底层代码,
public class JNIUtils {
public static native void passJava2Native(Student persion);
public static native Student getJavaFromNative();
static {
System.loadLibrary("java2struct");
}
}
我们定义了两个本地方法,一个是将Java对象传递给底层,另一个是从底层返回一个Java对象。
然后,我们执行javah -jni com.example.java2struct.JNIUtils命令来得到头文件,并得到两个本地方法