web-dev-qa-db-fra.com

Passer des types de données de Java vers C (ou vice versa) en utilisant JNI

En utilisant JNI, pouvons-nous passer des types de données personnalisés de Java à C (ou vice versa)? Je vois un mappage de types de données primitifs à des types en C mais je ne sais pas trop si nous pouvons envoyer à travers nos propres données types (par exemple, envoyer à travers ou retourner un objet employé ou quelque chose!).

31
user277460

Si vous allez faire cela avec beaucoup d'objets, quelque chose comme Swig serait le mieux. Vous pouvez utiliser le type de projet pour transmettre des objets personnalisés. La syntaxe n'est pas sympa, il y a peut-être une meilleure façon d'écrire ceci.

Exemple d'objet employé:

public class Employee {
    private int age;

    public Employee(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }
}

Appelez ce code depuis un client:

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);
}

Vous pouvez avoir des fonctions JNI comme celle-ci pour passer un objet employé de Java à C, comme argument de méthode de travail:

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;
}

En renvoyant un objet employé de C à Java en tant que travail, vous pouvez utiliser:

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;
}
68
Stew