Используя JNI мы можем передать пользовательские типы данных от Java до C (или наоборот)? Я вижу отображение примитивных типов данных к типам в C, однако не слишком уверенном, если мы можем отправить через наши собственные типы данных (например, Отправить через или возвратить объект Сотрудника или что-то!).
Если вы собираетесь делать это с большим количеством объектов, например, Swig было бы лучше всего. Вы можете использовать тип проекта для передачи пользовательских объектов. Синтаксис не очень хороший, возможно, есть лучший способ написать это.
Пример объекта Employee:
public class Employee {
private int age;
public Employee(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
Вызов этого кода из некоторого клиента:
public class Client {
public Client() {
Employee emp = new Employee(32);
System.out.println("Pass employee to C and get age back: "+getAgeC(emp));
Employee emp2 = createWithAge(23);
System.out.println("Get employee object from C: "+emp2.getAge());
}
public native int getAgeC(Employee emp);
public native Employee createWithAge(int age);
}
У вас могут быть такие функции JNI для передачи объекта сотрудника из Java в C в качестве аргумента метода объекта задания:
JNIEXPORT jint JNICALL Java_Client_getAgeC(JNIEnv *env, jobject callingObject, jobject employeeObject) {
jclass employeeClass = (*env)->GetObjectClass(env, employeeObject);
jmethodID midGetAge = (*env)->GetMethodID(env, employeeClass, "getAge", "()I");
int age = (*env)->CallIntMethod(env, employeeObject, midGetAge);
return age;
}
Передача объекта сотрудника вернувшись с C на Java в качестве задания, вы можете использовать:
JNIEXPORT jobject JNICALL Java_Client_createWithAge(JNIEnv *env, jobject callingObject, jint age) {
jclass employeeClass = (*env)->FindClass(env,"LEmployee;");
jmethodID midConstructor = (*env)->GetMethodID(env, employeeClass, "<init>", "(I)V");
jobject employeeObject = (*env)->NewObject(env, employeeClass, midConstructor, age);
return employeeObject;
}