Передача типов данных от Java до C (или наоборот) использование JNI

Используя JNI мы можем передать пользовательские типы данных от Java до C (или наоборот)? Я вижу отображение примитивных типов данных к типам в C, однако не слишком уверенном, если мы можем отправить через наши собственные типы данных (например, Отправить через или возвратить объект Сотрудника или что-то!).

31
задан user277460 23 March 2010 в 23:18
поделиться

1 ответ

Если вы собираетесь делать это с большим количеством объектов, например, 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;
}
69
ответ дан 27 November 2019 в 21:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: